我想在JS中「得到」繼承。 我剛剛發現了一個巧妙的方法來從一個對象的所有屬性基本上覆制到另一個:JS中的繼承:this.base = Class(); this.base()或...?
function Person(name){
this.name="Mr or Miss: "+name;
this.introduce = function(){
console.log("Hi, I am "+this.name);
}
}
function Employee(name,title){
this.title=title;
this.base=Person;
this.base(name);
}
e = new Employee('tony', 'manager')
e.introduce();
請注意,我有一個構造一個Person()類,並通過構造函數生成的屬性「名」。 關於這一點的好處還在於,員工在構造函數中也有名稱 - 並且瞧,它使用相同的參數創建Person對象。
如果我曾與 「原型」 的方式做到了這一點:
function Person(name){
this.introduce = function(){
console.log("Hi, I am "+this.name);
}
}
function Employee(name, title){
this.name = name; /* ?!?!?!?!? I can't call the proper constructor here */
this.title = title;
}
Employee.prototype= new Person(); /* ?!?!? NO NAME HERE..>? */
Employee.prototype.constructor = Employee;
e = new Employee('tony', 'manager')
e.introduce();
錯誤....現在該怎麼辦?我甚至無法完成這個:Employee中的this.name不能使用適當的Person構造函數來設置; Person對象的創建在繼承中只發生一次。
那麼...我錯過了什麼?我的第一個例子是「我的」辦法嗎?有沒有辦法與第二個例子有相同的結果?
幫助!
我無法表達我對這個答案,我感激不盡...... – Merc
我完全理解在谷歌關閉圖書館的功能(哇,我一定要得到的地方:d)但是!根據我的理解,當我創建派生類時,如果我想繼承內部屬性,則由我來決定,鍵入Parent.call(this);或Parent.call(這個名字) - 是嗎?難道你不是總想這麼做嗎? – Merc
@Tony:我想你會的。但是,如果你有經典的繼承(比如Java),那麼如果覆蓋它,你還必須調用父類的構造函數。唯一的區別是在JavaScript中你基本上總是覆蓋構造函數,因爲這是我們如何模擬類。所以它實際上沒有什麼不同,也許更容易理解正在發生的事情。 –