2012-12-31 116 views
1

我有一些的jsfiddle代碼在這裏:http://jsfiddle.net/xyuY6/JavaScript的命名空間,並繼承

,代碼:

var App= {}; 

App.WebPage = { 
WebPage : function(name) { 
    alert("In Super"); 
    this.name = name; 
}, 

Home : function(name) { 
     alert("In Sub"); 
     App.WebPage.WebPage.call(this, name); 
} 


}; 

App.WebPage.WebPage.prototype.sayName = function() { 
alert(this.name); 
}; 

inherit(App.WebPage.WebPage, App.WebPage.Home); 

var x = new App.WebPage.Home("zack"); 
x.sayName(); 

function inherit(subType, superType) { 
    alert("IN HERE"); 
    var p = Object.create(superType); 
    p.constructor = subType; 
    subType.prototype = p; 
} 

我試圖做這個命名空間創建一個App命名空間兩個構造, WebPageHomeWebPage是「超級類型」,Home是「子類型」。家應該繼承從WebPage的一切。

雖然你會看到當你運行JavaScript時,問題是在我做x.sayName時,WebPage原型上定義的sayName函數沒有被調用。因此,它不被繼承。

爲什麼?

感謝您的幫助!

回答

2

好像你得到了超和子類在某些時候混合起來(在通話或inherit的定義)...

這裏是固定的代碼(如果我明白你正在嘗試做):http://jsfiddle.net/45uLT/

var App= {}; 

App.WebPage = { 
    WebPage : function(name) { 
     alert("In Super"); 
     this.name = name; 
    }, 

    Home : function(name) { 
      alert("In Sub"); 
      App.WebPage.WebPage.call(this, name); 
    } 


}; 


App.WebPage.WebPage.prototype.sayName = function() { 
    alert(this.name); 
}; 

inherit(App.WebPage.WebPage, App.WebPage.Home); 

var x = new App.WebPage.Home("zack"); 
x.sayName(); 

function inherit(superType, subType) { 
    alert("IN HERE"); 
    var p = new superType; 
    subType.prototype = p; 
    subType.prototype.constructor = subType; 
} 

希望這是你想要的。

+0

這正是我一直在尋找。謝謝! – user1513171

+0

我更新了jsFiddle。嘗試覆蓋sayName方法。你能告訴我爲什麼這不起作用嗎? http://jsfiddle.net/45uLT/1/ – user1513171

+0

沒關係,只需要改變一些調用的順序。 – user1513171

1

下面是根據你想上面做什麼的jsfiddle工作示例:

http://jsfiddle.net/8GwRd/

var App = (function() { 
    function WebPage(name) { 
     this.type = 'WebPage'; 
     this.name = name; 
    } 

    WebPage.prototype.sayName = function() { 
     alert(this.name + ' is a ' + this.type); 
    }; 

    function Home(name) { 
     WebPage.call(this, name); 
     this.type = 'Home' 
    } 

    Home.prototype = new WebPage(); 

    return { 
     WebPage: WebPage, 
     Home: Home 
    };  

})(); 

var y = new App.WebPage('bob'); 
y.sayName(); 

var x = new App.Home("zack"); 
x.sayName(); 
+0

這種方法與我的完全不同。這種方法可能更好嗎? – user1513171

+0

謝謝,我喜歡這個解決方案。 – user1513171