Javascript Object.create

Javascript Object.create

本文关键字:create Object Javascript      更新时间:2023-09-26

关于这里到底发生了什么,有点困惑。

给定这个简单的代码:

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对象创建一个新对象。

zzvv共享同一个原型对象,因此如果修改原型对象stuff,则更改将反映在派生对象zzvv中。无论您是通过$.extend还是其他方式修改原型,都不重要,也不管您是通过派生对象还是原型修改原型。

在代码中,foo对象附加到原型,而不是派生对象stuff0和vv。当在派生对象zz上调用extendFoo时,它正在修改原型上的foo,因此对foo的更改由派生对象共享。

在第二个例子中,在setFoo

this.foo = bar;

实际情况是,您正在对派生对象设置foo属性,因此现在它将覆盖原型的foo。在派生对象上运行setFoo之后,该对象的stuff0不再是原型的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