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

歡迎訪問 生活随笔!

生活随笔

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

javascript

javascript:面向对象编程基础:继承

發布時間:2025/1/21 javascript 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 javascript:面向对象编程基础:继承 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
"繼承是面向對象開發的又一個重要概念,它可以將現實生活的概念對應帶程序邏輯中"。“? 雖然在JavaScript中沒有專門的機制來實現類的繼承,但可以通過拷貝一個類的prototype 到另外一個類來實現繼承”。我們看到這里繼承的概念是多么的直白,“拷貝一個類的prototype 到另外一個類”,好,Code is cheap,看代碼:
Code
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 方法:
Code
//定義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正確的類繼承:

Code
function?class1()?{
????
//構造函數?
}
class1.prototype?
=?{
????method:?
function()?{
????????alert(
"method1");
????},
????method2:?
function()?{
????????alert(
"method2");
????}
}
function?class2()?{
????
//構造函數
}

//讓class2?繼承于class1?
for?(var?p?in?class1.prototype)?{
????class2.prototype[p]?
=?class1.prototype[p];?//?利用反射機制和prototype實現繼承
}

//覆蓋定義class1中的method?方法?
class2.prototype.method?=?function()?{
????alert(
"class2?new?method1");
}


//創建兩個類的實例
var?obj1?=?new?class1();
var?obj2?=?new?class2();

function?test()?{
????
//分別調用兩個對象的method?方法?
????obj1.method();
????obj2.method();
????
//分別調用兩個對象的method2?方法
????obj1.method2();
????obj2.method2();
}
從運行結果可見,obj2中重復定義的method?已經覆蓋了繼承的method方法,同時method2 方法未受影響。而且obj1中的method 方法仍然保持了原有的定義。這樣,就實現了正確意義的類的繼承。為了方便開發,可以為每個類添加一個共有的方法,用以實現類的繼承:
Code
//為類添加靜態方法inherit表示繼承于某類?
Function.prototype.inherit?=?function(baseClass)?{
????
for?(var?p?in?baseClass.prototype)?{
????????
this.prototype[p]?=?baseClass.prototype[p];
????}
}

function?class1()?{
????
//構造函數?
}
class1.prototype?
=?{
????method:?
function()?{
????????alert(
"method1");
????},
????method2:?
function()?{
????????alert(
"method2");
????}
}
function?class2()?{
????
//構造函數
}

//讓class2?繼承于class1?
//
for?(var?p?in?class1.prototype)?{
//
????class2.prototype[p]?=?class1.prototype[p];?//?利用反射機制和prototype實現繼承
//
}

class2.inherit(class1);?
//?等價于上面注釋掉的那一個for循環

//覆蓋定義class1中的method?方法?
class2.prototype.method?=?function()?{
????alert(
"class2?new?method1");
}


//創建兩個類的實例
var?obj1?=?new?class1();
var?obj2?=?new?class2();

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

上面的代碼使邏輯變的更加清楚,也更容易理解。通過這種方法實現的繼承,有一個缺點,就是在class2 中添加類成員定義時,不能給prototype 直接賦值,而只能對其屬性進行賦值,例如不能為:
class2.prototype={
?????????????????????????? //成員定義
????????????????????? }?
?而只能為:???????????????
??? class2.prototype.propertyName=someValue;?
????class2.prototype.methodName=function(){?
?????????????????????????//語句
????????????????????? }

???由此可見,這樣實現繼承仍然要以犧牲一定的代碼可讀性為代價。有沒有“不僅基類可以用對象直接賦值給property,而且在派生類中也可以同樣實現,使代碼邏輯更加清晰,也更能體現面向對象的語言特點”的js繼承方式?引號里的說法是多么的誘人啊,繼續學習去了。

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的javascript:面向对象编程基础:继承的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产欧美三级 | 国产精品电影在线观看 | 男女瑟瑟视频 | 久久人妻免费视频 | 97精品熟女少妇一区二区三区 | 熟妇高潮一区二区三区在线播放 | 一区二区三区有限公司 | 精品无码国产av一区二区三区 | 欧美三级视频在线播放 | 国产91美女视频 | 亚洲国产欧美一区 | 秋葵视频在线 | 久久av资源网 | 国产在线拍揄自揄拍无码 | 成人午夜在线免费观看 | 日韩精品你懂的 | 91精品国产乱码在线观看 | 夜夜添无码一区二区三区 | 亚洲精品久久久久av无码 | 18禁免费无码无遮挡不卡网站 | 日本一区免费电影 | 91欧美激情一区二区三区成人 | 大地资源二中文在线影视免费观看 | 97av在线 | 亚洲视频中文字幕在线观看 | 内裤摩擦1v1h| 高清三区 | 日韩午夜激情电影 | 三级性生活视频 | 日韩女优一区二区 | 美女操出白浆 | 天堂中文在线观看 | 国产黄色免费大片 | 爱情岛论坛自拍亚洲品质极速最新章 | 国产美女流白浆 | 日日夜夜免费精品 | 欧美日本在线看 | 国产91在线免费观看 | 日韩人妻一区二区三区 | 日韩激情电影在线 | 国产精品果冻传媒潘 | 老外一级片 | 男受被做哭激烈娇喘gv视频 | 成人毛片100免费观看 | 中文字幕在线视频观看 | 污版视频在线观看 | av电影免费在线播放 | 欧美一区二区公司 | 天天综合人人 | 欧美日韩精品在线观看 | 国产一区在线看 | jizz日韩| 一级黄色片在线播放 | 国产v亚洲v天堂无码久久久 | 超黄av| 亚洲精品喷潮一区二区三区 | 欧美性受xxxx黒人xyx性爽 | 最新在线观看av | 亚洲天堂小说 | 亚洲精品尤物 | www天天干 | 中文字幕乱码人妻无码久久95 | 中文字幕乱码一二三区 | 自拍偷拍第一页 | 成人综合在线观看 | 国产毛片电影 | 女人的洗澡毛片毛多 | 成人v精品蜜桃久一区 | 欧美激情精品 | 日本人的性生活视频 | 日韩欧美视频二区 | 久久青青视频 | 国产乱码精品一区二区三区五月婷 | 一本一道久久a久久综合蜜桃 | 欧美成人精品激情在线视频 | 人体裸体bbb欣赏 | 亚洲超丰满肉感bbw 悠悠av | 制服丝袜先锋影音 | 日韩欧美中文字幕一区二区三区 | 91插插插插插 | 亚洲19p | 69久人妻无码精品一区 | 夜夜爽夜夜 | 日韩少妇中文字幕 | 91久久精品夜夜躁日日躁欧美 | 欧美激情自拍 | www.操.com | 亚洲图色av | 午夜激情在线视频 | av黄色av| 欧美自拍区 | 国产精品久久精品 | 新香蕉视频 | 无码人妻aⅴ一区二区三区 国产高清一区二区三区四区 | 久久久精品人妻av一区二区三区 | 大学生三级中国dvd 日韩欧美一区二区区 | 少妇太爽了在线观看 | _级黄色片| 日韩欧美专区 |