国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

基于JavaScript實現繼承機制之原型鏈(prototype chaining)的詳解

2019-11-20 22:44:29
字體:
來源:轉載
供稿:網友

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

復制代碼 代碼如下:

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不等。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 浮梁县| 青川县| 平潭县| 武城县| 尉氏县| 禄丰县| 敖汉旗| 正镶白旗| 项城市| 个旧市| 襄城县| 峡江县| 扎兰屯市| 玉山县| 乌兰察布市| 涪陵区| 龙泉市| 宝鸡市| 广平县| 内黄县| 荔浦县| 尚义县| 宣化县| 神池县| 二手房| 乌鲁木齐县| 东乡县| 周口市| 外汇| 澄迈县| 河津市| 筠连县| 仁化县| 沁源县| 岫岩| 武邑县| 岫岩| 宜良县| 衡东县| 磐安县| 鄂托克前旗|