Javascript Object.create
Javascript Object.create
关于这里到底发生了什么,有点困惑。
给定这个简单的代码:
stuff = (function(){
function extendFoo(bar)
{
$.extend(this.foo,bar);
}
this.foo = {};
return { foo : foo, extendFoo: extendFoo};
})();
按照这个简单的操作:
zz = Object.create(stuff);
zz.extendFoo({bar:'bar'});
vv = Object.create(stuff); //foo is still extended(??)
因此,据我所知,对返回的对象窗体object.create进行的操作仍然会影响该对象的原型,因此,当你创建一个新对象时,他的原型会发生变化,从而产生一个"修改"的版本。
这似乎在很多层面上都是错误的,有人能解释一下这里发生了什么吗?
使用以下模式无法再现此行为:
stuff = (function(){
function setFoo(bar)
{
this.foo = bar;
}
var foo;
return { foo : foo, setFoo: setFoo};
})();
所以我怀疑这里应该归咎于$.extend。
任何投入都会很棒!
这个问题与模块模式无关,而是与原型有关。
zz = Object.create(stuff)
创建了一个以CCD_ 1为原型的新对象。
vv = Object.create(stuff)
使用与其原型相同的CCD_ 2对象创建一个新对象。
zz
和vv
共享同一个原型对象,因此如果修改原型对象stuff
,则更改将反映在派生对象zz
和vv
中。无论您是通过$.extend
还是其他方式修改原型,都不重要,也不管您是通过派生对象还是原型修改原型。
在代码中,foo
对象附加到原型,而不是派生对象stuff
0和vv
。当在派生对象zz
上调用extendFoo
时,它正在修改原型上的foo
,因此对foo
的更改由派生对象共享。
在第二个例子中,在setFoo
中
this.foo = bar;
实际情况是,您正在对派生对象设置foo
属性,因此现在它将覆盖原型的foo
。在派生对象上运行setFoo
之后,该对象的stuff
0不再是原型的foo
。你可以通过运行来看到这一点
zz = Object.create(stuff);
console.log(zz.hasOwnProperty('foo')); // false
zz.setFoo(bar);
console.log(zz.hasOwnProperty('foo')); // true
delete zz.foo;
console.print(zz.foo); // foo is the original foo, not null
console.log(zz.hasOwnProperty('foo')); // false
实际上,你会得到你原来的foo
而不是null
。
setFoo
在第二种情况下工作的原因是,您不再修改原型,因此派生对象之间不再共享更改。使用原件的
$.extend(this.foo,bar);
您正在原地修改对象this.foo
,而不是重写。您也可以通过hasOwnProperty
看到这一点
zz = Object.create(stuff);
console.log(zz.hasOwnProperty('foo')); // false
zz.extendFoo({bar:'bar'});
console.log(zz.hasOwnProperty('foo')); // false
相关文章:
- 使用Object.create()的角度服务继承
- 在使用object.create创建的对象中使用super
- 正在使用object.create()创建XMLHttpRequest对象
- Object.create()只读名称属性
- childObj.prototype = Object.create(parentObj.prototype) 和 ch
- object.create 不使用我的新值
- Object.create() instead of prototype
- Object.create and Prototypes
- Javascript Object.create
- 使用Object.create作为原型的原型继承将[Object]作为实例的原型
- 不涉及私有“函数”的“Object.create”的自定义实现
- 正在对通过object.create创建的对象设置原型
- javascript中的Object.create方法
- 重写JavaScript中的Object.create方法
- 在不使用object.Create的情况下创建具有null原型的javascript对象
- JavaScript inheritance Object.create
- 为什么MDN Object.create polyfill上的Temp.prototype设置为null
- 使用Object.create()创建对象的模式
- 使用“new”关键字创建的对象和使用“Object.create”创建的对象给出不同的结果
- Object.create(Object.prototype)、Object.create(Object)和Object