摘要:繼承原型式繼承所謂原型是繼承,就是定義一個(gè)函數(shù),該函數(shù)中創(chuàng)建一個(gè)零食性的構(gòu)造函數(shù),將作為參數(shù)傳入的對(duì)象作為這個(gè)構(gòu)造函數(shù)的原型,最后返回這個(gè)構(gòu)造函數(shù)的實(shí)例對(duì)象。借助構(gòu)造函數(shù)無論是原型鏈還是原型是繼承,都具有相同的問題。
繼承 原型鏈
原型鏈?zhǔn)钦f明
構(gòu)造函數(shù)或構(gòu)造器具有prototype屬性,對(duì)象具有proto屬性,這就是之前學(xué)習(xí)的原。如果構(gòu)造函數(shù)或?qū)ο驛 。A的原型指向構(gòu)造函數(shù)或?qū)ο驜,B的原型在指向構(gòu)造函數(shù)或?qū)ο驝,依次類推,最終的構(gòu)造函數(shù)或?qū)ο笤椭赶騉bject的原型。由此形成一條鏈狀結(jié)構(gòu),被稱之為原型鏈。按照上述描述,在B中定義的屬性或發(fā)放,可以直接在A中使用不需要定義。 這就是繼承,它允許每一個(gè)對(duì)象訪問器原型鏈上的任何屬性和方法。
原型鏈實(shí)現(xiàn)繼承
function A(){
this.name ="a";
this.toString = function(){return this.name};
}
function B (){
this.name = "b";
}
function C(){
this.name ="c";
this.age=18;
this.getAge =function(){return this.age};
}
B.prototype =new A();
C.prototype =new B();
只繼承于原型
出于對(duì)效率的考慮,盡可能地將屬性和方法添加到原型上。可以采取以下方式:
不要為繼承關(guān)系多帶帶創(chuàng)建對(duì)象;
盡量減少運(yùn)行的方法搜索。
代碼如下:
function A(){}
A.prototype.name ="a";
Aprototype.toString = function(){return this.name};
function B(){}
B.prototype=A.prototype;
B.prototype.name="b";
function C(){}
C.protype =B.protype;
C.protype.name="c";
C.protype.age=18;
C.protype.getAge =function(){return this.age};
原型鏈的問題
原型鏈雖然很強(qiáng)大,用它可以實(shí)現(xiàn)JavasScript中的繼承,但同時(shí)也存在一些問題。
原型鏈實(shí)際上是在多個(gè)構(gòu)造函數(shù)或?qū)ο笾苯庸蚕韺傩曰蚍椒ā?br>創(chuàng)建子類的對(duì)象是不能向父級(jí)的構(gòu)造函數(shù)傳遞任何參數(shù)。
綜上所述,在實(shí)際開發(fā)中很少會(huì)多帶帶使用原型鏈。
原型式繼承
所謂原型是繼承,就是定義一個(gè)函數(shù),該函數(shù)中創(chuàng)建一個(gè)零食性的構(gòu)造函數(shù),將作為參數(shù)傳入的對(duì)象作為這個(gè)構(gòu)造函數(shù)的原型,最后返回這個(gè)構(gòu)造函數(shù)的實(shí)例對(duì)象。
function object (o){
function F(){}
F.prototype = o ;
return new F();
}
根據(jù)原型繼承的總結(jié)的object()函數(shù)實(shí)現(xiàn)繼承,如下代碼:
var preson ={
name:"MARY",
friends:["Tom","King"]
}
var anotherPerson =object(person);
anotherperson.friends.push("Rob");
console.log(antherperson.friends);
這種原型繼承要求必須具有一個(gè)對(duì)象可以看作最為另一個(gè)對(duì)象的基礎(chǔ)。
借助構(gòu)造函數(shù)
無論是原型鏈還是原型是繼承,都具有相同的問題。想要解決這樣的問題的話可以借助構(gòu)造函數(shù)(也可以叫做偽造對(duì)象的經(jīng)典繼承)。
這種方式實(shí)現(xiàn)非常簡單,就是在子對(duì)象的構(gòu)造函數(shù)中調(diào)用父對(duì)象的構(gòu)造函數(shù)。具體可以通過調(diào)用函數(shù)。
apply()call()方法實(shí)現(xiàn)。
apply()和call()方法都允許傳遞制定某個(gè)對(duì)象的this。對(duì)于繼承來講, 可以實(shí)現(xiàn)在子對(duì)象的構(gòu)造函數(shù)中調(diào)用父對(duì)象的構(gòu)造函數(shù),將子對(duì)象的this和父對(duì)象的this綁定子啊一起。
代碼如下:
function SuperType(){
this.color=["red","green","blue"];
}
function SubType(){
SuperType.call(this);
}
var instance=new Subtype();
instance.color;
組合方式繼承
組合繼承,也叫做為經(jīng)典繼承,指的是將原型鏈或原型繼承和借助構(gòu)造函數(shù)的技術(shù)組合在一起,發(fā)揮二中的長處繼承方式。
集體實(shí)現(xiàn)的思路就是:
使用原型鏈或原型是繼承實(shí)現(xiàn)對(duì)原型的繼承屬性和方法的繼承。
通過借助構(gòu)造函數(shù)實(shí)現(xiàn)的實(shí)例對(duì)象的屬性繼承。
這樣,即通過在原型上定義方法實(shí)現(xiàn)函數(shù)的重用,又可以保證每一個(gè)對(duì)象都又自己的專有屬性。
代碼如下:function SuperType(name){
this name = name;
}
superType.prototype.sayme=function(){
console.log(this.name)}
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/108368.html
摘要:在使用原型鏈實(shí)現(xiàn)繼承時(shí)有一些需要我們注意的地方注意繼承后的變化。在了解原型鏈時(shí),不要忽略掉在末端還有默認(rèn)的對(duì)象,這也是我們能在所有對(duì)象中使用等對(duì)象內(nèi)置方法的原因。 在上一篇post中,介紹了原型的概念,了解到在javascript中構(gòu)造函數(shù)、原型對(duì)象、實(shí)例三個(gè)好基友之間的關(guān)系:每一個(gè)構(gòu)造函數(shù)都有一個(gè)守護(hù)神——原型對(duì)象,原型對(duì)象心里面也存著一個(gè)構(gòu)造函數(shù)的位置,兩情相悅,而實(shí)例呢卻又...
摘要:繼承的繼承可以簡單的認(rèn)為就是上篇文章中的寄生組合繼承模型幾乎一模一樣,只是在語法結(jié)構(gòu)上多了和關(guān)鍵字,另外一個(gè)區(qū)別就是父類和子類通過連接。 ES5繼承 VS ES6繼承 前言 ES6 已經(jīng)發(fā)展了很長時(shí)間里 javascript相對(duì)于其他例如java等是一門比較怪異的語言, 由于其歷史原因其繼承機(jī)制和對(duì)象生成方式被人詬病. ES6 的出現(xiàn)將徹底改變這一現(xiàn)狀, ES6 引入了新的生成對(duì)象(類...
摘要:首當(dāng)其沖的便是接口中的每個(gè)聲明必須是即便不指定也是,并且不能設(shè)置為非,詳細(xì)規(guī)則可參考可見性部分介紹。函數(shù)式接口有著不同的場景,并被認(rèn)為是對(duì)編程語言的一種強(qiáng)大的擴(kuò)展。抽象類與中的接口有些類似,與中支持默認(rèn)方法的接口更為相像。 原文鏈接:http://www.javacodegeeks.com/2015/09/how-to-design-classes-and-interfaces.htm...
摘要:構(gòu)造函數(shù)通常首字母大寫,用于區(qū)分普通函數(shù)。這種關(guān)系常被稱為原型鏈,它解釋了為何一個(gè)對(duì)象會(huì)擁有定義在其他對(duì)象中的屬性和方法。中所有的對(duì)象,都有一個(gè)屬性,指向?qū)嵗龑?duì)象的構(gòu)造函數(shù)原型由于是個(gè)非標(biāo)準(zhǔn)屬性,因此只有和兩個(gè)瀏覽器支持,標(biāo)準(zhǔn)方法是。 從這篇文章開始,復(fù)習(xí) MDN 中級(jí)教程 的內(nèi)容了,在初級(jí)教程中,我和大家分享了一些比較簡單基礎(chǔ)的知識(shí)點(diǎn),并放在我的 【Cute-JavaScript】系...
摘要:在中對(duì)一個(gè)實(shí)例命名非常的簡單,在每一個(gè)類中可以有一個(gè)靜態(tài)的實(shí)例對(duì)象,可以用類的完全限定名作為實(shí)例的名字。但不管怎樣,用類的完全限定名作為實(shí)例的名字是一個(gè)非常好的方式。 本文是對(duì)log4j官網(wǎng)Introduction部分的翻譯,原文鏈接地址:http://logging.apache.org/log...。 Introduction: 幾乎每個(gè)大型應(yīng)用都包含自己的日志API。1996年,...
閱讀 1815·2021-11-22 09:34
閱讀 3100·2019-08-30 15:55
閱讀 680·2019-08-30 15:53
閱讀 2068·2019-08-30 15:52
閱讀 3010·2019-08-29 18:32
閱讀 2002·2019-08-29 17:15
閱讀 2406·2019-08-29 13:14
閱讀 3566·2019-08-28 18:05