2012-11-19 41 views
1

我今天正在閱讀骨幹的源代碼,試圖瞭解它是如何工作的。我嘗試使自己的初始化方法在myModel實例化時觸發,但它似乎不起作用。 (警告「默認你好」)試圖瞭解JS原型繼承,爲什麼不會發生這種情況?

我在想,當myModel被創建時,它會將「this.initialize.apply」複製到myModel中,它會從Model的原型繼承initialize方法。如果myMethod沒有初始化方法,它會查找鏈,但如果myMethod確實有它,它會使用它。從我(錯誤地)思考,myModel讀取像「myModel.initialize.appy(this,arguments)」這樣的應用,但它似乎是在調用Models。

任何想法,我要去哪裏錯了? 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(); 
+0

所有你正在做的是覆蓋您創建並分配給'myModel'的對象。 –

回答

3

有了您的new Model()行,你要創建一個全新的對象,並把對它的引用到myModel變量。

以前定義在myModel上的initialize函數完全沒有相關性。它永遠不會發揮作用。只要你丟失了一個垃圾收集器的引用,它就會被它的新值覆蓋掉myModel變量。

+0

Oooh,現在很有意義,我不能相信我錯過了!再次查看Backbone的源代碼,擴展方法必須將方法(包括初始化)複製到新的方法。謝謝!! – SkinnyG33k

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/

相關問題