不能使用Object.create在javascript中的对象内创建对象

时间:2014-01-15 19:10:54

标签: javascript jquery oop

假设我有以下代码:

(function($) {
    var Obj = {
        init: function() {
            var c1 = Object.create(this.MyChild);
            var c2 = Object.create(this.MyChild);
            c1.init(); //not working!!!
        },
        MyChild: function() {
            this.init = function() {
                console.log('calling MyChild init function');   
            }
        }
    };

    Obj.init();
})(jQuery);

创建Obj时,我使用了object literal,因为我不需要创建它的实例,并且在创建MyChild对象时,我使用了构造函数并使用了Object.create,因为我需要创建MyChild的多个实例。

但是,当我调用Object.create时,它不起作用,当调用c1.init()时,它表示init函数未定义,但如果我将Object.create(this.MyChild)替换为:< / p>

var c1 = new this.MyChild(); 
c1.init();

为什么?

2 个答案:

答案 0 :(得分:1)

我认为你应该使用

var c1 = Object.create(this.MyChild.prototype);

而不是

var c1 = Object.create(this.MyChild);

答案 1 :(得分:1)

Object.create(func)new func()没有做同样的事情!

Object.create()创建一个(否则为空!)对象,该原型将被设置为该对象,并传递给该函数(MDN

要在示例中使用Object.create(),您可以像这样修改它:

(function($) {
    var Obj = {
        init: function() {
            var c1 = Object.create(this.MyChild);
            var c2 = Object.create(this.MyChild);
            c1.init(); //not working!!!
        },
        MyChild: {
            init: function() {
                console.log('calling MyChild init function');   
            }
        }
    };

    Obj.init();
})(jQuery);

但是在这种情况下,一切都只是POINT到你的MyChild对象。 MyChild的属性将在您使用Object.create()创建的每个对象之间共享。