代码中有几个问题。
function Foo() {
this.Bar = Bar;
// etc..
}
var Bar = {
__words : {},
addWord : function (word, amount) {
this.__words[word] = amount;
}
// etc..
}
Bar 应该在 Foo 之前定义,但它可能没有问题,因为变量实际上是在函数范围级别定义的,这在这个特定示例中可能不是问题。
也就是说,您正在 Foo 构造函数中复制一个对象。对象是可变的,所以它不起作用。对对象的一项更改将更改另一项。你能做的就是这个。这是另一种没有新的方法。
var Bar = {
create: function () {
var obj = Object.create(this);
obj.__words= {};
return obj;
},
addWord: function (word, amount) {
this.__words[word] = amount;
}
...other methods...
};
var Foo = function () {
this.Bar = Bar.create();
// etc..
};
但我不知道Object.create
其他浏览器如何支持。这是语法等同于 Felix 写的,你可以清楚地删除两个对象的需要。
唯一的大区别是,不是写 new Bar()。您实际上是在创建一个原型对象并从原型创建一个对象。create 是构造函数。
Foo 可以用同样的方式写,你会得到这样的东西。
var Bar = {
create: function () {
var obj = Object.create(this);
obj.__words= {};
return obj;
},
addWord: function (word, amount) {
this.__words[word] = amount;
},
...other methods...
};
var Foo = {
create: function () {
var foo = Object.create(this);
foo.Bar = Bar.create();
return foo;
},
....
};
var foo1 = Foo.create();
var foo2 = Foo.create();
foo1.bar.addWord("allo", 3);
我想这完全取决于您要做什么,但 create 方法比“新”运算符具有一些优势。例如,您可以创建在对象创建后执行回调的异步方法。
在这里了解更多信息。最后它几乎是一样的。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create