1. 程式人生 > 程式設計 >JS中的繼承操作例項總結

JS中的繼承操作例項總結

本文例項講述了JS中的繼承操作。分享給大家供大家參考,具體如下:

1.原型鏈繼承

function SuperType() {
  this.property = true; 
}
SuperType.prototype.getSuperValue = function() {
  return this.property;
}
function SubType() {
  ths.subproperty = false;
}
SubType.prototype = new SuperType();   // 實現繼承
SubType.prototype.getSubValue = function() {
  return this.subproperty;
}
var instance = new SubType();
console.log(instance.getSuperValue());   // true

原理:讓SuperType的例項成為子類的原型物件,子類的例項擁有了父類的屬性和方法。但也有弊端,如果父類的屬性是引用型別,這將導致共享的屬性被改變的時候,全部的屬性將被改變,我們一下程式碼。

function SuperType() {
  this.property = [1,2,3]; 
}
SuperType.prototype.getSuperValue = function() {
  return this.property;
}
function SubType() {
  ths.subproperty = false;
}
SubType.prototype = new SuperType();   // 實現繼承
SubType.prototype.getSubValue = function() {
  return this.subproperty;
}
var instance1 = new SubType();
var instance2 = new SubType();
instance1.property.push(4);
console.log(instance1.property);   // [1,3,4]
console.log(instance2.property);   // [1,4]

我們修改一處的例項屬性,兩個例項的屬性都會被修改,因為這個屬性是共享的,這也是原型鏈繼承的缺點。

2.建構函式繼承

function SuperType(name) {
  this.name = name;
  this.numbers = [1,3];
}
function SubType() {
  SuperType.call(this,"Nicholas");
  this.age = 29;
}

var instance1 = new SubType();
var instance2 = new SubType();
instance1.property.push(4);
console.log(instance1.name);    // Nicholas
console.log(instance1.age);     // 29
console.log(instance1.numbers);   // [1,4]
console.log(instance2.numbers); // [1,3]

在子類中呼叫父類的建構函式,每次例項化時都會新建父類的屬性放在新例項中,因此每個例項中的屬性都是不一樣的,改變一個例項的值不會造成另一個例項的值改變。這個繼承方式的缺點是方法的定義不能複用。

3.組合繼承

這個方法將原型鏈繼承和建構函式繼承結合到一起,融合了他們各自的優點。

function SuperType(name) {
  this.name = name;
  this.colors = ["red","blue","green"]
}
SuperType.prototype.sayName = function() {
  console.log(this.name);
}
function SubType(name,age) {
  SuperType.call(this,name);
  this.age = age;
}
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function() {
  console.log(this.age);
}

var instance1 = new SubType("Nicholas",29);
var instance2 =new SubType("Greg",27);
instance1.colors.push("black");
console.log(instance1.colors);    // red,blue,green,black
console.log(instance2.colors);    // red,green
instance1.sayName();         // Nicholas
instance2.sayName();         // Greg
instance1.sayAge();           // 29
instance2.sayAge();           // 27 

4.class繼承

ES6中可以通過class建立物件,通過關鍵字extends繼承。

class Point {
 constructor(x,y) {
  this.x = x;
  this.y = y;
 }
}

class ColorPoint extends Point {
 constructor(x,y,color) {
  this.color = color; // ReferenceError
  super(x,y);
  this.color = color; // 正確
 }
}

在ES6的繼承中,子類一定要重寫父類的構造函授的方法,否則會報錯。

感興趣的朋友可以使用線上HTML/CSS/JavaScript程式碼執行工具:http://tools.jb51.net/code/HtmlJsRun測試上述程式碼執行效果。

更多關於JavaScript相關內容感興趣的讀者可檢視本站專題:《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》、《JavaScript遍歷演算法與技巧總結》及《JavaScript數學運算用法總結》

希望本文所述對大家JavaScript程式設計有所幫助。