ts中是這樣的數組
class Greeter { greeting:string; constructor(message:string){ this.greeting = message; } greet(){ console.log("Hello," + this.greeting) } } let greeter = new Greeter("world") class Dog extends Greeter{ bark() { console.log('Woof! Woof!'); } } let dog = new Dog('123') dog.bark() dog.greet()
通過tsc test.ts編譯成ES5的源碼以下,可在對應生成的test.js中查看瀏覽器
var __extends = (this && this.__extends) || (function () {//(this && this.__extends) 有this且已有該函數則不執行後面的函數 var extendStatics = function (d, b) { // 從這個函數的名字就能夠看到它是實現靜態的屬性的繼承的 // 靜態屬性就是直接綁定在構造函數這個函數對象上的屬性 // function (d, b) { d.__proto__ = b; } 將b對象設置爲d對象的原型 extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; // 上面這種是兼容老版本瀏覽器的拷貝繼承 return extendStatics(d, b); // {__proto__: []} instanceof Array用來判斷瀏覽器是否支持__proto__屬性 // instanceof運算符用於測試構造函數的prototype屬性是否出如今對象的原型鏈中的任何位置 // b.prototype 是否存在於d的原型鏈上 // {} 空的對象的__proto__屬性設爲空數組,Array 是[]的原型鏈上的,因此返回true }; return function (d, b) { extendStatics(d, b);//完成靜態屬性繼承 function __() { this.constructor = d; }//新構造函數,將constructor指向d d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); //若是b 是null 即空對象,則d的prototype 等於Object.create(b),即初始化一個新對象 //v8上直接{}建立對象比Object.create(null)快 //不然,採用原型繼承,__的prototype 等會 b 的 }; })(); var Greeter = /** @class */ (function () { function Greeter(message) { this.greeting = message; } Greeter.prototype.greet = function () { console.log("Hello," + this.greeting); }; return Greeter; }()); var greeter = new Greeter("world"); var Dog = /** @class */ (function (_super) { __extends(Dog, _super); function Dog() { return _super !== null && _super.apply(this, arguments) || this; } Dog.prototype.bark = function () { console.log('Woof! Woof!'); }; return Dog; }(Greeter)); var dog = new Dog('123'); dog.bark(); dog.greet();
總結:理解起來仍是挺費勁的,或者說到如今都沒徹底理解,面向對象、原型鏈這一塊容易忘記,固然,仍是理解的不夠深入,否則很難忘掉的。app