【发布时间】:2015-03-01 22:49:25
【问题描述】:
对于这里到底发生了什么有点困惑。
鉴于这个简单的代码:
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 应该归咎于此。
任何输入都会很棒!
【问题讨论】:
-
请注意,IEFE 中的
this.foo = {};创建了一个您不想要的全局变量,请使用var foo = {}。不过,这对您的问题没有影响。 -
Prototypal inheritance - Issues with nested objects 是否充分回答了您的问题?您使用模块模式和 setter 方法可能会掩盖问题
-
您的代码中有两个主要错误:
return { foo: foo,中的foo未定义,this.foo = {}中的this实际上是window对象。请更正这些
标签: javascript module-pattern revealing-module-pattern