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

首頁 > 語言 > JavaScript > 正文

javascript 面向對象編程基礎:繼承

2024-05-06 14:14:21
字體:
來源:轉載
供稿:網友
我們看到這里繼承的概念是多么的直白,“拷貝一個類的prototype 到另外一個類”,好,Code is cheap,看代碼:

function class1() { }
function class2() { }
class2.prototype = class1.prototype;
class2.moreProperty1 = " class 2 additional string " ;
class2.moreMethod1 = function () { alert( " class 2 additional method " ); }
/*
這樣,首先是class2具有了和class1 一樣的prototype,不考慮構造函數,兩個類是等價的。
隨后,又通過prototype給class2賦予了兩個額外的方法。所以class2是在class1的基礎上
增加了屬性和方法,這就實現了類的繼承。
*/

function test() {
var obj = new class2();
// JavaScript提供了instanceof 操作符來判斷一個對象是否是某個類的實例
alert(obj instanceof class2); // true
alert(obj instanceof class1); // ?
}

運行代碼,結果是不是在我們的意料之中?表面上看,上面的實現完全可行,js也可以正確的理解和實現這種繼承關系,obj同時是class1和 class2的實例,但實質上則不然(我們學習的目的是要知其然更要知其所以然)。js的這種理解實際上是基于一種很簡單的策略,看下面的代碼,先使用 prototype讓class2 繼承于class1,再在class2 中重復定義method 方法:

// 定義class1
function class1() {
// 構造函數
}
// 定義class1 的成員
class1.prototype = {
m1: function () { // 方法1
alert( " class1 method1 " );
}
}
// 定義class2
function class2() {
// 構造函數
}
// 讓class2 繼承于class1
class2.prototype = class1.prototype;

// 給class2 重復定義方法method
class2.prototype.method = function () {
alert( " whose method2? class1 or class2 " );
}
// 創建兩個類的實例
var obj1 = new class1();
var obj2 = new class2();

function test() {
// 分別調用兩個對象的method 方法
obj1.method();
obj2.method();
}

從代碼執行結果看,method方法在class1,2中運行的結果是相同的。

由此可見,當對class2 進行prototype 的改變時,class1的prototype也隨之改變,即使對class2 的prototype 增減一些成員,class1的成員也隨之改變。所以class1 和class2 僅僅是構造函數不同的兩個類,它們保持著相同的成員定義。說到這里,相信讀者已經發現了其中的奧妙:class1 和class2 的prototype 是完全相同的,是對同一個對象的引用。其實從這條賦值語句就可以看出來:
//讓class2 繼承于class1
class2.prototype=class1.prototype;
在js中,除了基本的數據類型(數字、字符串、布爾類型等),所有的賦值以及函數參數都是引用傳遞,而不是值傳遞。所以上面的語句僅僅是讓class2 的prototype 對象引用class1 的prototype,造成了類成員定義始終保持一致的效果。從這里也看到了instanceof 操作符的執行機制,它就是判斷一個對象是否是一個prototype 的實例,因為這里的obj1 和obj2 都是對應于同一個prototype,所以它們instanceof 的結果都是相同的。由此可見,使用prototype 引用拷貝實現繼承不是一種正確的辦法。但在要求不嚴格的情況下,卻也是一種合理的方法,唯一的約束是不允許類成員的覆蓋定義(這里其實也是js的靈活性的體現)。其實,我們完全可以利用反射機制和prototype 來實現js正確的類繼承:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 建水县| 会昌县| 阿拉善左旗| 准格尔旗| 金秀| 新竹市| 广宗县| 罗平县| 普兰县| 凌源市| 安塞县| 崇信县| 黔南| 中西区| 宝鸡市| 大厂| 固原市| 彭山县| 蓬莱市| 崇阳县| 南召县| 靖江市| 鸡泽县| 衡东县| 平潭县| 安宁市| 凤台县| 东安县| 宜良县| 界首市| 遂川县| 安乡县| 镇康县| 潼关县| 晴隆县| 郎溪县| 鲁甸县| 铜陵市| 田阳县| 微博| 五莲县|