如果我在对象文字上使用 Object.create() 创建多个对象,我会得到多个不共享属性值的唯一对象。但是,当我在从模块返回的对象上使用 Object.create() 时,看起来它们共享相同的引用?这是为什么?
#1 模块:
var objModule = (function () {
var name = "module 1";
var setName = function( strName ) {
name = strName;
};
var getName = function() {
return name;
};
return {
setName: setName,
getName: getName
};
}());
var objModule2 = Object.create(objModule);
objModule2.setName("module 2");
console.log(objModule.getName()); // WRONG prints "module 2"
console.log(objModule2.getName()); // prints "module 2"
#2 字面量:
var objLiteral = {
name : "literal 1"
};
var objLiteral2 = Object.create(objLiteral);
objLiteral2.name = "literal 2";
console.log(objLiteral.name); // prints "literal 1"
console.log(objLiteral2.name); // prints "literal 2"
编辑
#3 模块“构造函数”:
var module = function () {
var name = "module 1";
var setName = function( strName ) {
name = strName;
};
var getName = function() {
return name;
};
return {
setName: setName,
getName: getName
};
};
var objModule1 = module();
var objModule2 = module();
objModule2.setName("module 2");
console.log(objModule1.getName()); // prints "module 1"
console.log(objModule2.getName()); // prints "module 2"
编辑
如果我像构造函数一样使用模块(如@Matt Browne 建议的那样)并创建 2 个对象,结果就像使用对象文字一样。我想了解的是为什么模块示例 #1 的行为与模块示例 #3 不同?
编辑 2
正如@ben336 解释的那样,代码:
var objModule2 = Object.create(objModule);
将 objModule2 的原型设置为 objModule。这在示例 #3 中不会发生,因此这两个对象不共享相同的闭包属性。