2013-04-08 90 views
1
 function inherit(p){ 
     if(p == null) throw TypeError(); 
     if(Object.create) return Object.create(p); 
     var t = typeof p; 
     if(t != "function" || t != "object") throw TypeError(); 
     function f(){}; 
     f.prototype = p; 
     return new f; 
    } 


    function Super_class(){ 
     this.Sup_prop = "I'm superclass"; 
     this.Sup_prop2 = "I'm superclass2"; 
    } 
    Super_class.prototype.Hello = function(){ alert("Hello"); }; 


    function Sub_class(){ 
     this.sub_prop = "I'm subclass"; 
     this.sub_prop2 = "I'm subclass 2"; 
    } 
    Sub_class.prototype = inherit(Super_class); 
    Sub_class.prototype.constructor = Sub_class; 

    var x = new Sub_class; 
    x.Hello(); 

這段代碼來自Javascript權威指南手冊,它解釋瞭如何創建一個子類,但它不起作用。子類不起作用,爲什麼?

我見過有關如何在本網站創建子類的代碼。

function Super_class(){ 
     this.Sup_prop = "I'm superclass"; 
     this.Sup_prop2 = "I'm superclass2"; 
    } 
    Super_class.prototype.Hello = function(){ alert("Hello"); }; 


    function Sub_class(){ 
     this.sub_prop = "I'm subclass"; 
     this.sub_prop2 = "I'm subclass 2"; 
    } 
    Sub_class.prototype = new Super_class; 

    var x = new Sub_class; // change here 
    x.Hello();// It work!! 

我想知道爲什麼我的書中的代碼不工作。我的書有錯誤或我錯了。

P.S我的英語寫作不好,對不起。

UPDATE 這是我上面的第一個例子。

Sub_class.prototype = inherit(Super_class); 
    Sub_class.prototype.constructor = Sub_class; //Why did set be Sub_class?? 

我想知道爲什麼「Sub_class.prototype.constructor」設置爲Sub_class? 我的書沒有解釋它。

+0

它以什麼方式不起作用?有什麼症狀? – 2013-04-08 02:29:03

+0

警報不起作用。當我在Web瀏覽器中測試時,它有錯誤消息「has not method Hello」。 – Domino 2013-04-08 02:35:20

回答

1

你應該通過

Super_class.prototype 

,而不是Super_class的繼承功能。這似乎期待原型對象,而不是函數本身

+0

這是錯誤的。整個參數列表(包括括號)是可選的。例如,參見[new'運營商的Mozilla參考頁面](https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Operators/new)。 – 2013-04-08 02:59:28

+0

@TedHopp我同意你的意見。它沒有參數,它可以避免。 – Domino 2013-04-08 03:01:08

+0

@TedHopp是的,我意識到我的錯誤。以前從未見過這種語法。當我在小提琴中進行測試時,我意識到我錯了這個問題。 – 2013-04-08 03:02:02

1

的問題是在你的inherit功能,特別是與這一行:

if(Object.create) return Object.create(p); 

這將返回一個新的對象與它的原型設置爲p。但是,p不是Super_class的實例;這是功能Super_class。我不確定當你將inherit作爲參數接收一個對象時你想要做什麼,但是當它接收到一個函數時,你不想使用Object.create。試試這個從inherit開始:

function inherit(p) { 
    if (typeof p === 'function') { 
     return new p; 
    } 
    throw TypeError() 
} 
+0

感謝您的建議!! :) – Domino 2013-04-08 03:16:36