日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JavaScript实现继承机制(3)——通过原型链(prototype chaining)方式

發布時間:2025/3/15 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JavaScript实现继承机制(3)——通过原型链(prototype chaining)方式 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

我們知道在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是一個空對象{},{}自然與ClassB.prototype不等。

轉載于:https://www.cnblogs.com/CodeGuy/archive/2013/05/06/3062747.html

總結

以上是生活随笔為你收集整理的JavaScript实现继承机制(3)——通过原型链(prototype chaining)方式的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。