1. 程式人生 > >Typescript 學習筆記四:回憶ES5 中的類

Typescript 學習筆記四:回憶ES5 中的類

中文網:https://www.tslang.cn/

官網:http://www.typescriptlang.org/

目錄:

最簡單的類

function Person (name, age) { // 建構函式
  this.name = name; // 屬性
  this.age = age;
}
var p = new Person('張三', 25); // 例項化物件,p 為 Person 的一個例項
console.log(p.name);

函式名首字母大寫,函式內用 this 處理的函式稱為建構函式。

用 new 關鍵字例項化建構函式的變數是該建構函式的例項。

類定義屬性和方法

可以在建構函式和原型鏈上定義屬性和方法。

function Person (name, age) {
  // 建構函式內定義屬性和方法
  this.name = name; // 例項屬性
  this.age = age;

  this.run = function () { // 例項方法
    console.log(this.name + '在運動');
  }
}
// 原型鏈上定義屬性和方法
Person.prototype.sex = '男';
Person.prototype.work = function () {
  console.log(this.name + '在工作');
}

var p = new Person('張三', 25);
p.run(); // 呼叫例項方法
p.work();

原型鏈上面的屬性會被多個例項共享,建構函式裡的屬性不會

類的靜態屬性和方法

直接給建構函式設定屬性和方法,不需要例項化即可獲得的。

建構函式內的屬性和方法,原型鏈上的屬性和方法都需要例項化之後才可獲得。

function Person (name, age) {
  // 建構函式內定義屬性和方法
  this.name = name; // 屬性
  this.age = age;

  this.run = function () { // 方法
    console.log(this.name + '在運動');
  }
}

// 靜態屬性、方法
Person.address = 'xxx';
Person.getInfo = function () {
  console.log('靜態方法');
}
// 呼叫
console.log(Person.address);
Person.getInfo();
Person.run(); // 錯誤,只有例項物件才可呼叫

var p = new Person();
p.run();

繼承:物件冒充實現

物件冒充可以繼承建構函式裡面的屬性和方法,但是沒法繼承原型鏈上面的屬性和方法

// 父類
function Person (name, age) {
  this.name = name;
  this.age = age;

  this.run = function () {
    console.log(this.name + '在運動');
  }
}
Person.prototype.sex = '男';
Person.prototype.work = function () {
  console.log(this.name + '在工作');
}

// 子類繼承父類
function Child () {
  Person.call(this); // 物件冒充實現繼承
}


var c = new Child('張三', 25);
c.run();
c.work(); // 錯誤,沒有 work 方法

繼承:原型鏈實現

原型鏈繼承:可以繼承建構函式裡面的屬性和方法,也可以繼承原型鏈上面的屬性和方法。但是例項化子類的時候沒法給父類傳參。

// 父類
function Person (name, age) {
  this.name = name;
  this.age = age;

  this.run = function () {
    console.log(this.name + '在運動');
  }
}
Person.prototype.sex = '男';
Person.prototype.work = function () {
  console.log(this.name + '在工作');
}

// 子類繼承父類
function Child (name, age) {

}
Child.prototype = new Person(); // 原型鏈實現繼承

var c = new Child('張三', 25);
c.run(); // undefined 在運動
c.work(); // undefined 在工作

繼承:原型鏈+物件冒充的組合繼承模式

原型鏈繼承:可以繼承建構函式裡面的屬性和方法,也可以繼承原型鏈上面的屬性和方法。但是例項化子類的時候沒法給父類傳參。

// 父類
function Person (name, age) {
  this.name = name;
  this.age = age;

  this.run = function () {
    console.log(this.name + '在運動');
  }
}
Person.prototype.sex = '男';
Person.prototype.work = function () {
  console.log(this.name + '在工作');
}

// 子類繼承父類
function Child (name, age) {
  Person.call(this, name, age); // 物件冒充繼承,例項化子類可以給父類傳參
}
Child.prototype = new Person(); // 原型鏈實現繼承,繼承原型鏈上的屬性和方法
// 或者
// Child.prototype = Person.prototype; // 原型鏈實現繼承,繼承原型鏈上的屬性和方法

var c = new Child('張三', 25);
c.run(); // 張三在運動
c.work(); // 張三在工作