在JavaScript中创建一个新的空对象

时间:2013-06-09 20:53:08

标签: javascript object

当尝试创建一个空对象的新对象时,我无法获取旧数据。

这是我尝试过的一个例子:

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

3 个答案:

答案 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