试图了解JS原型继承,为什么不会这样做呢?

时间:2012-11-19 02:15:07

标签: javascript

我今天正在阅读骨干的源代码,试图了解它是如何工作的。我试图创建自己的初始化方法,当myModel被实例化时触发,但它似乎不起作用。 (提醒“默认你好”)

我在想,当myModel被创建时,它会将“this.initialize.apply”复制到myModel中,并且它会继承Model的原型中的initialize方法。如果myMethod没有初始化方法,它将查找链,但如果myMethod确实拥有它,它将使用它。从我(错误地)思考,myModel读取像“myModel.initialize.appy(this,arguments)”的应用,但它似乎是调用模型。

我想知道哪里出错了? http://jsfiddle.net/LvjpK/

function Model () {
    this.initialize.apply(this, arguments);
}


Model.prototype.initialize = function () {
    alert("Default Hello");
};


myModel = {
    initialize: function() {
        alert("Hello from myModel");
    }
};

var myModel = new Model();

2 个答案:

答案 0 :(得分:3)

使用new Model()行,您将创建一个全新的对象并将其引用到myModel变量中。

您之前在initialize上定义的myModel函数绝对没有相关性。它永远不会发挥作用。只要您丢失对它的引用,它就会被垃圾收集器拾取,方法是用它的新值覆盖myModel变量。

答案 1 :(得分:0)

这可能更符合您的目标:

function Model () {
    this.initialize.apply(this, arguments);
}


Model.prototype.initialize = function () {
    alert("Default Hello");
};


function MyModel() {
    // Call the Model constructor function.
    Model.apply(this, arguments);
}

// Make MyModel inherit from Model
MyModel.prototype = Object.create(Model.prototype);

// Override the initialize method on MyModel
MyModel.prototype.initialize = function() {
    alert("Hello from myModel");
};

var myModel = new MyModel();

JSFiddle:http://jsfiddle.net/uh2ev/