当尝试创建一个空对象的新对象时,我无法获取旧数据。
这是我尝试过的一个例子:
function Foo() {
this.Bar = Bar;
// etc..
}
var Bar = {
__words : {},
addWord : function (word, amount) {
this.__words[word] = amount;
}
// etc..
}
现在,当我创建一个新对象时:
var foo = new Foo();
var bar = foo.Bar;
bar.addWord("hello",7);
bar.addWord("world",9);
var lorem = new Foo();
var words = lorem.Bar.__words; // This will display {hello:7,world:9} from the
// previous object
我也尝试使用Object.create()
,但它仍然相同,显示前一个对象的__words
。
答案 0 :(得分:4)
Bar
引用的对象在每个Foo
实例之间共享。
我没有真正意识到将逻辑放入两个对象的意义,你可以用一个构造函数来做到这一点:
function Foo() {
this.__words = {};
}
Foo.prototype.addWord = function(word, amount) {
this.__words[word] = amount;
}
var foo = new Foo();
foo.addWord("hello",7);
var bar = new Foo();
bar.addWord("world",9);
如果你真的必须分开这些功能,那么也要使Bar
成为一个构造函数,并在Foo
构造函数方法中创建一个新实例:
function Foo() {
this.bar = new Bar();
}
function Bar() {
this.__words = {};
}
Bar.prototype.addWord = function(word, amount) {
this.__words[word] = amount;
}
答案 1 :(得分:0)
我无法获取旧数据。
嗯,你没有清除实际上是全局的var Bar
- 意味着你正在创建一个带有var lorem = new Foo();
的新对象,但是给他带有Foos构造函数的Bar对象。
this.Bar = Bar;
如果你想要一个新的对象,你应该给Foo自己的Bar对象。 或者包括:
__words : {},
addWord : function (word, amount) {
this.__words[word] = amount;
在Foo本身。
无论如何,如果你只需要一次,你可以简单地清空Bar中的单词数组。
答案 2 :(得分:0)
代码中存在几个问题。
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写的,你可以清楚地删除两个对象的需要。
唯一不同的是,而不是写新的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);
我想这一切都取决于你想要做什么,但创建方法作为一些优于“新”运营商的优势。例如,您可以创建在对象创建后执行回调的异步方法。
在这里获取更多信息。最后它几乎是一样的。
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create