JavaScript實現繼承機制(3)——通過原型鏈(prototype chaining)方式

來源:互聯網
上載者:User

我們知道在JavaScript中定義類的原型方式,而原型鏈擴充了這種方式,以一種有趣的方式實現繼承機制。

prototype 對象是個模板,要執行個體化的對象都以這個模板為基礎。總而言之,prototype 對象的任何屬性和方法都被傳遞給那個類的所有執行個體。原型鏈利用這種功能來實現繼承機制。

如果用原型方式重定義前面例子中的類,它們將變為下列形式:

function ClassA() {}ClassA.prototype.color = "blue";ClassA.prototype.sayColor = function () {    alert(this.color);};function ClassB() {}ClassB.prototype = new ClassA();

原型方式的神奇之處在於最後一行代碼。這裡,把 ClassB 的 prototype 屬性設定成 ClassA 的執行個體。這很有意思,因為想要 ClassA 的所有屬性和方法,但又不想逐個將它們 添加到ClassB 的 prototype 屬性。還有比把 ClassA 的執行個體賦予 prototype 屬性更好的方法嗎?

注意:調用 ClassA 的建構函式,沒有給它傳遞參數。這在原型鏈中是標準做法。要確保建構函式沒有任何參數。

 

與對象冒充相似,子類的所有屬性和方法都必須出現在 prototype 屬性被賦值後,因為在它之前賦值的所有方法都會被刪除。為什嗎?因為 prototype 屬性被替換成了新對象,添加了新方法的原始對象將被銷毀。所以,為 ClassB 類添加 name 屬性和 sayName() 方法的代碼如下:

function ClassB() {}ClassB.prototype = new ClassA();ClassB.prototype.name = "";ClassB.prototype.sayName = function () {    alert(this.name);};

可通過運行下面的例子測試這段代碼:

var objA = new ClassA();var objB = new ClassB();objA.color = "blue";objB.color = "red";objB.name = "John";objA.sayColor();objB.sayColor();objB.sayName();

此外,在原型鏈中,instanceof 運算子的運行方式也很獨特。對 ClassB 的所有執行個體,instanceof 為 ClassA 和 ClassB 都返回 true。例如:

var objB = new ClassB();alert(objB instanceof ClassA);    //輸出 "true"alert(objB instanceof ClassB);    //輸出 "true"

在 ECMAScript 的弱類型世界中,這是極其有用的工具,不過使用對象冒充時不能使用該方法判斷。但是由於子類的原型被直接重新賦值,所以出現以下這種情況:

console.log(objB.__proto__===objB.constructor.prototype)   //false

因為ClassB的原型鏈 prototype 屬性被另一個類的對象重寫了。輸出結果可以看出objB.__proto__仍然指向的是ClassB.prototype,而不是objB.constructor.prototype。這也很好理解,給Person.prototype賦值的是一個對象直接量new ClassA()執行個體,使用對象直接量方式定義的對象其構造器(constructor)指向的是根構造器Object,Object.prototype是一個Null 物件{},{}自然與ClassB.prototype不等。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.