我自己總結了一下,可供參考:
1.借用建構函式繼承function Person (name, age) { this.type = "human" this.name = name this.age = age}function Student (name, age) { // 借用建構函式繼承屬性成員 Person.call(this, name, age)}var s1 = Student("張三", 18)console.log(s1.type, s1.name, s1.age) // => human 張三 18我們透過 call 的方式呼叫了父類建構函式 Person實現了繼承,這種形式的繼承,每個子類例項都會複製一份父類建構函式中的方法,作為例項自己的方法。這樣做,有幾個缺點: 1. 每個例項都複製一份,佔用記憶體大,尤其是方法過多的時候。 2. 方法都作為了例項自己的方法,當需求改變,要改動其中的一個方法時,之前所有的 例項,他們的該方法都不能及時作出更新。只有後面的例項才能訪問到新方法。
2.複製繼承function Person (name, age) { this.type = "human" this.name = name this.age = age}Person.prototype.sayName = function () { console.log("hello " + this.name)}function Student (name, age) { Person.call(this, name, age)}// 原型物件複製繼承原型物件成員for(var key in Person.prototype) { Student.prototype[key] = Person.prototype[key]}var s1 = Student("張三", 18)s1.sayName() // => hello 張三效率較低,記憶體佔用高(因為要複製父類的屬性)無法獲取父類不可列舉的方法(不可列舉方法,不能使用for in 訪問到)
3.組合繼承function Person (name, age) { this.type = "human" this.name = name this.age = age}Person.prototype.sayName = function () { console.log("hello " + this.name)}function Student (name, age) { Person.call(this, name, age)}// 利用原型的特性實現繼承Student.prototype = new Person()var s1 = Student("張三", 18)console.log(s1.type) // => humans1.sayName() // => hello 張三組合繼承模式避免了原型鏈和借用建構函式的缺陷,融合了它們的優點。是JavaScript中最常用的繼承模式。而且,instanceof運算子和isPrototypeOf()方法也能夠用於識別基於組合繼承模式建立的物件。
我自己總結了一下,可供參考:
1.借用建構函式繼承function Person (name, age) { this.type = "human" this.name = name this.age = age}function Student (name, age) { // 借用建構函式繼承屬性成員 Person.call(this, name, age)}var s1 = Student("張三", 18)console.log(s1.type, s1.name, s1.age) // => human 張三 18我們透過 call 的方式呼叫了父類建構函式 Person實現了繼承,這種形式的繼承,每個子類例項都會複製一份父類建構函式中的方法,作為例項自己的方法。這樣做,有幾個缺點: 1. 每個例項都複製一份,佔用記憶體大,尤其是方法過多的時候。 2. 方法都作為了例項自己的方法,當需求改變,要改動其中的一個方法時,之前所有的 例項,他們的該方法都不能及時作出更新。只有後面的例項才能訪問到新方法。
2.複製繼承function Person (name, age) { this.type = "human" this.name = name this.age = age}Person.prototype.sayName = function () { console.log("hello " + this.name)}function Student (name, age) { Person.call(this, name, age)}// 原型物件複製繼承原型物件成員for(var key in Person.prototype) { Student.prototype[key] = Person.prototype[key]}var s1 = Student("張三", 18)s1.sayName() // => hello 張三效率較低,記憶體佔用高(因為要複製父類的屬性)無法獲取父類不可列舉的方法(不可列舉方法,不能使用for in 訪問到)
3.組合繼承function Person (name, age) { this.type = "human" this.name = name this.age = age}Person.prototype.sayName = function () { console.log("hello " + this.name)}function Student (name, age) { Person.call(this, name, age)}// 利用原型的特性實現繼承Student.prototype = new Person()var s1 = Student("張三", 18)console.log(s1.type) // => humans1.sayName() // => hello 張三組合繼承模式避免了原型鏈和借用建構函式的缺陷,融合了它們的優點。是JavaScript中最常用的繼承模式。而且,instanceof運算子和isPrototypeOf()方法也能夠用於識別基於組合繼承模式建立的物件。