0

当试图创建一个新对象时,一个空的用于操作的对象,我无法取出旧数据。

这是我尝试过的示例:

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来自上一个对象。

4

3 回答 3

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;
}
于 2013-06-09T21:01:49.970 回答
0

我不能把旧数据拿出来。

好吧,您实际上并没有清除var Bar哪个是全局的 - 这意味着您正在创建一个新对象,var lorem = new Foo();但给他相同的 Bar Object 和 Foos 构造函数。

this.Bar = Bar; 

如果你想要一个新的对象,你应该给 Foo 自己的 Bar 对象。或包括:

__words : {},
    addWord : function (word, amount) {
        this.__words[word] = amount;

在 Foo 本身。

无论如何,如果您只需要一次,您可以简单地清空 Bar 中的单词数组。

于 2013-06-09T20:59:45.140 回答
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 写的,你可以清楚地删除两个对象的需要。

唯一的大区别是,不是写 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

于 2013-06-09T21:00:07.810 回答