2015-05-30 29 views
2

我想找出用於在javascript中實例化對象的特定構造函數,而不是原型鏈中的最後一個。考慮代碼:在多級繼承中查找構造函數

function F(){}; 
function E(){}; 
function D(){}; 
function C(){}; 
function B(){}; 
function A(){}; 

E.prototype= new F(); 
D.prototype= new E(); 
C.prototype= new D(); 
B.prototype= new C(); 
A.prototype= new B(); 

a=new A(); 

查找小提琴here

a.constructor回報function F(){},但我想返回function A(){},因爲A是用於實例化對象的構造方法。

這怎麼能實現?

+0

a.constructor.prototype給我F. –

+0

我寫了一篇關於「正確」的方式在JavaScript中設置繼承http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html –

+0

您可以查看[classy.js](https://github.com/classy,js )爲類似java的OOP功能(並支持sweet.js)(我是作者) –

回答

3

隨着你從父母繼承的方式,它是不可能的訪問原始的構造,因爲當你寫

A.prototype = new B(); 

A.prototype.constructor確實指向BA了。

使用此模式進行原型繼承時,必須正確手動設置構造函數。所以,你要麼爲每個擴展類手工做,或者你可以使用輔助函數:

function inherit(C, P) { 
 
    C.prototype = new P(); 
 
    C.prototype.constructor = C; 
 
} 
 

 
function F(){}; 
 
function E(){}; 
 
function D(){}; 
 
function C(){}; 
 
function B(){}; 
 
function A(){}; 
 

 
inherit(E, F); 
 
inherit(D, E); 
 
inherit(C, D); 
 
inherit(B, C); 
 
inherit(A, B); 
 

 
var a = new A(); 
 
var c = new C() 
 

 
document.write(a.constructor + "<br>"); 
 
document.write(c.constructor);

+0

你應該教OP,實例化基類只是爲了設置繼承是壞的。 http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html。使用'C.prototype = Object.create(P.prototype);' –

+0

感謝dfsq指引我在正確的方向,我發現[link](https://developer.mozilla.org/en-US/docs/ Web/JavaScript/Reference/Operators/new)構造函數Foo的新運算符創建一個從Foo.prototype繼承的新對象。 Foo.prototype具有構造函數屬性,通過將A.prototype分配給新的B(),包含構造函數屬性的原型對象基本上被覆蓋(一直到E),導致在原型鏈中搜索到最後一個類型爲F的對象。因此我們需要自己指定構造函數屬性。 – user1707873

0

你檢查了John Resig的Class.js嗎? http://ejohn.org/blog/simple-javascript-inheritance/ 它在JavaScript中實現繼承,並使您可能要求的東西成爲可能。

編輯: 對不起。我錯了。但是,您可以添加這樣的事情你聲明:

A.prototype= new B(); 
A.prototype.constructor = B; 

不知道它可以擁有的一切後果,但它似乎工作!

+0

發佈更多信息一些示例代碼也許 – inye

1

執行以下操作:

function F(){}; 
function E(){}; 
function D(){}; 
function C(){}; 
function B(){}; 
function A(){}; 

E.prototype= new F(); 
E.prototype.constructor = E; 
D.prototype= new E(); 
D.prototype.constructor = D; 
C.prototype= new D(); 
C.prototype.constructor = C; 
B.prototype= new C(); 
B.prototype.constructor = B; 
A.prototype= new B(); 
A.prototype.constructor = A; 
+0

'A.prototype.constructor = A;'應該足夠了,不是嗎? – sarbbottam

+0

如果您只對對象'A'感興趣,那麼就足夠了。 – Karlen

+0

@sarbottam不是真的,你應該到處解決這個問題,OP明確地說一般條款 –