[英]Javascript Prototype and inheritance
我來自保守的 OOP 語言(JAVA),並不真正了解 Javascript 繼承。 我也對整個 Prototype 概念感到不安,但我在這里看到了一個例子來滿足我的需要,但我不明白細節以及為什么事情沒有不同。
以他們為例,正確的實現如下
function Animal(name) {
this.name = name;
}
// Example method on the Animal object
Animal.prototype.getName = function() {
return this.name;
}
function Mammal(name, hasHair) {
// Use the parent constructor and set the correct `this`
Animal.call(this, name);
this.hasHair = hasHair;
}
// Inherit the Animal prototype
Mammal.prototype = Object.create(Animal.prototype);
// Set the Mammal constructor to 'Mammal'
Mammal.prototype.constructor = Mammal;
我不明白 Object.call() 函數的目的,也不明白為什么使用 Object.create() 而不僅僅是 Animal.prototype。 另外為什么在最后一行添加了構造函數? 是不是因為在之前的步驟中被抹掉了? 如果我想在所有 Mammal 實例之間共享代碼,我該怎么辦?
提前致謝
如果你沒有調用Mammal.prototype.constructor = Mammal;
那么構造函數將是 Animal() (默認情況下它是 Animal.prototype 的構造函數)
使用Object.create()
意味着 Mammal.prototype 不是對 Animal.prototype 的引用,而是一個繼承該原型的新對象。
並且使用Object.call()
確保作用域不是調用方法的函數的作用域,而是 Mammal 構造函數的作用域。
Javascript 不能像 Java 那樣擴展類。 你只能模擬類似的東西。
Animal.call 確保 Animal.this 不是指向動物而是指向哺乳動物。 簡而言之,call() 函數會覆蓋@this。
object.create 只是用給定的對象作為原型創建一個空函數的實例:
Object.create = function (o) {
function F() {};
F.prototype = o;
return new F();
}
只有在使用子構造器時才需要它。 如果不是一個簡單的對象也會這樣做。
這是一個很好的建議: http : //javascriptissexy.com/oop-in-javascript-what-you-need-to-know/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.