gpt4 book ai didi

javascript - Object.create 不是使用模块模式创建新对象

转载 作者:搜寻专家 更新时间:2023-11-01 05:05:59 24 4
gpt4 key购买 nike

如果我在对象文字上使用 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 的原型(prototype)设置为 objModule。这在示例 #3 中没有发生,因此这两个对象不共享相同的闭包属性。

最佳答案

示例 1

Object.create 的第一个参数指定正在创建的新对象的原型(prototype)对象。由于在您的第一个示例中,您将现有对象设置为新对象的原型(prototype),因此当您调用函数时,它们正在修改您存储在闭包中的变量,然后您的现有对象和新的。

这里要理解的两个关键点是:

  1. 这段代码

    var objModule = function () {
    var name = "module 1";
    var setName = function( strName ) {
    name = strName;
    };
    var getName = function() {
    return name;
    };

    return {
    setName: setName,
    getName: getName
    };
    }();

    创建一个闭包,函数 getName 和 setName 持有对 name 变量的访问。

  2. 这些函数是 objModule 的属性,当您调用 Object.create 时,您将 objModule 设置为 objModule2 的原型(prototype),它也可以访问这些函数。

由于这 2 个对象共享这些函数,并且它们可以访问模块创建的闭包,而不是将 name 属性本地存储在任一对象上,所以当您使用一个对象调用 set 函数时,它将更新闭包,从而更新两个对象。

例子2

在第二个示例中,您还将对象设置为新对象的原型(prototype),但是您在本地对象上声明了一个属性,该属性覆盖了原型(prototype)上的属性。

关于javascript - Object.create 不是使用模块模式创建新对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16127258/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com