我是JavaScript新手。我已经做了很多谷歌搜索,但未能找到我寻求的答案 - 可能是因为我使用了错误的术语。
前几天,我正在阅读有关创建JavaScript组件的基本教程:http://callmenick.com/post/javascript-objects-building-javascript-component-part-2
本教程的一部分涉及一组默认选项,这些选项分配给类型的原型链:
SimpleAlert.prototype.options = {
wrapper : document.body,
type : "default",
message : "Default message."
}
如果用户在构造期间提供SimpleAlert
类型,则可以使用不同的参数创建SimpleAlert
类型 - 否则使用默认选项。
function SimpleAlert( options ) {
this.options = extend( {}, this.options ); // Why?
extend( this.options, options );
// start the functionality...
}
构造函数如下所示:
extend
function extend( a, b ) {
for( var key in b ) {
if( b.hasOwnProperty( key ) ) {
a[key] = b[key];
}
}
return a;
}
函数定义为:
SimpleAlert
我对这段代码的理解是:
创建新的options
对象涉及用户传入自己的{ test : "Testing" }
对象。假设我通过options
传递extend
参数。 this.options
函数然后访问options
(我相信它是原型的options
实例,因为范围中没有定义其他{}
变量)并且基本上复制了所有内容共享实例到空this.options
对象,然后将其分配给共享的options
实例。
然后,用户提供{ test : "Testing" }
(在我的情况下extend
this.options
编辑test
共享实例(基本上将我的额外SimpleAlert.prototype.options
字段复制到共享实例)
但实际上,似乎共享实例在此示例中不受影响 - 意味着SimpleAlert
声明保持不变,以便this.options
的每个新实例都可以访问它(这是什么我想要)
但是,在我的实验中,我发现更改 var Animal = function(ovr) {
if (arguments.length > 0)
{
this.options.mode = ovr;
}
};
Animal.prototype.options = { mode: "Test" }; / I want this to be default for all instances created
var test = new Animal("Override"); // set this test obj to use "Overide"
console.log(test.options.mode); // outputs Override as expected
var again = new Animal();
console.log(again.options.mode); // also outputs Override (I want it to say "Test")
会导致原型值被修改......我确定无论我做错了什么都很容易修复,但我看不到它。这是一个例子:
> public function hasilCarianPermohonan()
{
$mukim_id = $_POST['mukim_id'];
$no_fail = $_POST['no_fail'];
$pemohon = $_POST['pemohon'];
$status = $_POST['status'];
if($pemohon == NULL)
{
$pemohon = "%";
} else if($no_fail == NULL)
{
$no_fail = "%";
}
$query = $this->db->query("SELECT * FROM permohonan pr INNER JOIN
status_permohonan st ON pr.no_fail = st.no_fail WHERE pr.mukim_id LIKE '$mukim_id' AND st.status LIKE '$status' AND (pr.no_fail LIKE '$no_fail' OR pr.pemohon LIKE '$pemohon') ORDER BY pr.app_id ASC");
if($query->num_rows() > 0)
{
return $query->result();
} else {
return false;
}
感谢您的帮助!
答案 0 :(得分:0)
正如您在代码中已经建议的那样,它错过了" copy"操作,以便您修改原型上的共享对象。
var Animal = function(ovr) {
if (arguments.length > 0) {
// Copy whatever is on this.options to a blank object,
// then assign this.options to be that newly copied object, so
// the prototype object is masked by the instance object.
this.options = Object.assign({}, this.options);
this.options.mode = ovr;
}
};
这可能有助于理解实例属性"掩盖"原型:
var Foo = function() {
console.log('a', this.x);
this.x = 100;
console.log('b', this.x);
delete this.x;
console.log('c', this.x);
};
Foo.prototype.x = 1;
new Foo();