2013-05-02 73 views
0

假設我們有一個抽象類動物:當它是一個子類的實例時如何獲取對象的類名?

function Animal(){}; 
Animal.prototype.communicate = function(metadata){ 
    //ABSTRACT 
}; 

然後我們有一個鴨類:

function Duck(){}; 
Duck.prototype = new Animal(); 
Duck.prototype.communicate = function(metadata){ 
    console.log("Cuack!"); 
}; 

所以,我一個書面方式的Greasemonkey腳本,我真的需要節省一些動物localstorage在下次加載頁面時檢索它們(這樣可以重新創建與reaload頁面相同的實例)。

所以,我真的需要創建每個動物的類名稱。我讀了另一個類似的問題,他們得到的類名的方法是:

var aDuck = new Duck(); 
console.log("ClassName: " + aDuck.constructor.name); 

但是當我這樣做,我得到「產品類別:動物」在控制檯上。 P/d:我不能改變編程風格與原型,它是一個要求... :(

任何建議 感謝您的時間

回答

0

要問對象ID它是同樣的東西要求對象類。解決方案是雙重調度。看到這裏:http://en.wikipedia.org/wiki/Double_dispatch

+0

感謝您發佈您的答案!請注意,你應該在這裏發佈答案的有用點。 [請參閱常見問題解答,其中提到的答案几乎不超過鏈接](http://stackoverflow.com/faq#deletion)。如果您願意,您可能仍然包含鏈接,但僅作爲「參考」。答案應該獨立,不需要鏈接。 – 2013-05-22 15:23:35

+0

已編輯!謝謝! – gal007 2013-05-25 22:22:54

2
Duck.prototype = new Animal(); 

這段代碼是錯誤的;的?!做原型繼承正確的做法是有點more complicated

如果你不能直接改變它,你仍然可以修復它的Greasemonkey:

Duck.prototype.constructor = Duck; 

您需要爲每個班級都做到這一點。

+0

謝謝SLaks!你能告訴我做原型繼承的正確方法嗎?也許讓我改變繼承方式:) – gal007 2013-05-02 17:51:47

2

的(並不完美,但)正確的方法是,首先調用Duck的背景下

function Duck() { 
    Animal.call(this); 
} 

Animal構造函數,然後你做了什麼:

Duck.prototype = new Animal(); 

然後明確地使Duck的實例的構造函數指向Duck

Duck.prototype.constructor = Duck; 
// so that all new Duck() 's constructor point to Duck 

PS:不要得罪,由@Slack給出的更復雜鏈路使用Object.create,新的JavaScript方法,做到這一點。有沒有回退的JavaScript < 1.8。我覺得OO JS at MDN解釋爲老年人JS

Object.create一個更好的(但並不完美)的嘗試已經進入照片在這個非常繼承要實現(子類擴展父):

function inherits(Parent, Child) { 
    function F() {} 
    F.prototype = Parent; 
    Child.prototype = new F(); 
} 

Object.createperfect-izes上述方法,着名地被稱爲Crockford's Prototypal Inheritance Way並實現它本地。
但是隻有現代版本的瀏覽器(我知道現在是主要份額)可用

相關問題