簡體   English   中英

Javascript 原型和繼承

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM