最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

學(xué)習(xí)javascript面向?qū)ο?javascript實(shí)現(xiàn)繼承的方式

 更新時(shí)間:2016年01月04日 10:07:16   作者:小火柴的藍(lán)色理想  
這篇文章主要為大家介紹了javascript實(shí)現(xiàn)繼承的方式,學(xué)習(xí)javascript面向?qū)ο?,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家介紹了javascript實(shí)現(xiàn)繼承的6種方式,分享給大家供大家參考,具體內(nèi)容如下

1、【原型鏈繼承】實(shí)現(xiàn)的本質(zhì)是重寫原型對(duì)象,代之以一個(gè)新類型的實(shí)例。實(shí)際上不是SubType的原型的constructor屬性被重寫了,而是SubType的原型指向了另一個(gè)對(duì)象——SuperType的原型,而這個(gè)原型對(duì)象的construtor屬性指向的是SuperType

function SuperType(){
 this.property = true;
}
SuperType.prototype.getSuperValue = function(){
 return this.property;
};
function SubType(){
 this.subproperty = false;
}
//繼承了SuperType
SubType.prototype = new SuperType();
SubType.prototype.getSubValue = function(){
 return this.subproperty;
}
var instance = new SubType();
alert(instance.getSuperValue());//true

[注意1]謹(jǐn)慎地定義方法,給原型添加方法的代碼一定要放在替換原型的語(yǔ)句之后

function SuperType(){
 this.property = true;
}
SuperType.prototype.getSuperValue = function(){
 return this.property;
};
function SubType(){
 this.subproperty = false;
}
//繼承了SuperType
SubType.prototype = new SuperType();

//添加了新方法
SubType.prototype.getSubValue = function(){
 return this.subproperty;
}
//重寫超類型的方法
SubType.prototype.getSuperValue = function(){
 return false;
}
var instance = new SubType();
alert(instance.getSuperValue());//false

[注意2]通過(guò)原型鏈實(shí)現(xiàn)繼承時(shí),不能使用對(duì)象字面量創(chuàng)建原型方法,這樣做會(huì)重寫原型鏈

function SuperType(){
 this.property = true;
}
SuperType.prototype.getSuperValue = function(){
 return this.property;
};
function SubType(){
 this.subproperty = false;
}
//繼承了SuperType
SubType.prototype = new SuperType();

//使用字面量方法添加新方法會(huì)導(dǎo)致上一行代碼無(wú)效
SubType.prototype = {
 getSubValue : function(){
  return this,subproperty;
 },
 someOtherMethod : function(){
  return false;
 }
};
var instance = new SubType();
alert(instance.getSuperValue());//error

[缺點(diǎn)1]在創(chuàng)建子類型的實(shí)例時(shí),不能向超類型的構(gòu)造函數(shù)中傳遞參數(shù)
[缺點(diǎn)2]包含引用類型值的原型屬性會(huì)被所有實(shí)例共享

function SuperType(){
 this.colors = ['red','blue','green'];
}
function SubType(){}
//繼承了SuperType
SubType.prototype = new SuperType();
var instance1 = new SubType();
instance1.colors.push('black');
alert(instance1.colors);//'red,blue,green,black'
var instance2 = new SubType();
alert(instance2.colors);//'red,blue,green,black'

2、【借用構(gòu)造函數(shù)繼承(又叫偽造對(duì)象或經(jīng)典繼承)】在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型構(gòu)造函數(shù),因此通過(guò)使用apply()和call()方法也可以在將來(lái)新創(chuàng)建的對(duì)象上執(zhí)行構(gòu)造函數(shù)

function SuperType(){
 this.colors = ['red','blue','green'];
}
function SubType(){
 //繼承了SuperType
 SuperType.call(this);
}
var instance1 = new SubType();
instance1.colors.push('black');
alert(instance1.colors);//'red,blue,green,black'
var instance2 = new SubType();
alert(instance2.colors);//'red,blue,green'

[優(yōu)點(diǎn)]傳遞參數(shù)

function SuperType(name){
 this.name = name;
}
function SubType(){
 //繼承了SUperType,同時(shí)還傳遞了參數(shù)
 SuperType.call(this,"Nicholas");
 //實(shí)例屬性
 this.age = 29;
}
var instance = new SubType();
alert(instance.name);//"Nicholas"
alert(instance.age);//29 

[注意]為了確保SuperType構(gòu)造函數(shù)不會(huì)重寫子類型的屬性,可以在調(diào)用超類型構(gòu)造函數(shù)后,再添加應(yīng)該在子類型中定義的屬性

function SuperType(name){
 this.name = name;
 this.age = 30;
}
function SubType(){
 //實(shí)例屬性
 this.age = 29;
 //繼承了SUperType,同時(shí)還傳遞了參數(shù)
 SuperType.call(this,"Nicholas");
}
var instance = new SubType();
//實(shí)例屬性被重寫為SuperType構(gòu)造函數(shù)的屬性
alert(instance.age);//30

[缺點(diǎn)1]無(wú)法實(shí)現(xiàn)函數(shù)復(fù)用
[缺點(diǎn)2]在超類型的原型中定義的方法,對(duì)子類型而言也是不可見(jiàn)的,結(jié)果所有類型都只能使用構(gòu)造函數(shù)模式
3、【組合繼承(又叫偽經(jīng)典繼承)】將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一起,從而發(fā)揮二者之長(zhǎng)的一種繼承模式。其背后的思路是使用原型鏈實(shí)現(xiàn)對(duì)原型屬性和方法的繼承,而通過(guò)借用構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。這樣,既通過(guò)在原型上定義方法實(shí)現(xiàn)了函數(shù)復(fù)用,又能夠保證每個(gè)實(shí)例都有它自己的屬性,成為JavaScript中最常用的繼承模式。

function SuperType(name){
 this.name = name;
 this.colors = ['red','blue','green'];
}
SuperType.prototype.sayName = function(){
 alert(this.name);
};
function SubType(name,age){
 //繼承屬性
 SuperType.call(this,name);
 this.age = age;
}
//繼承方法
SubType.prototype = new SuperType();
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
 alert(this.age);
}
var instance1 = new SubType("Nicholas",29);
instance1.colors.push("black");
alert(instance1.colors);//'red,blue,green,black'
instance1.sayName();//"Nicholas"
instance1.sayAge();//29
var instance2 = new SubType("Greg",27);
alert(instance2.colors);//'red,blue,green'
instance2.sayName();//"Greg"
instance2.sayAge();//27

[缺點(diǎn)]無(wú)論什么情況下,都會(huì)調(diào)用兩次超類型構(gòu)造函數(shù):一次是在創(chuàng)建子類型原型的時(shí)候,另一次是在子類型構(gòu)造函數(shù)內(nèi)部。子類型最終會(huì)包含超類型對(duì)象的全部實(shí)例屬性,但不得不在調(diào)用子類型構(gòu)造函數(shù)時(shí)重寫這些屬性。

function SuperType(name){
 this.name = name;
 this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function(){
 alert(this.name);
};
function SubType(name,age){
 SuperType.call(this,name); // 第二次調(diào)用SuperType()
 this.age = age;
}
SubType.prototype = new SuperType(); //第一次調(diào)用SuperType()
SubType.prototype.constructor = SubType;
SubType.prototype.sayAge = function(){
 alert(this.age);
}; 

4、【原型式繼承】借助原型可以基于已有的對(duì)象創(chuàng)建新對(duì)象,同時(shí)還不必因此創(chuàng)建自定義類型。從本質(zhì)上講,object()對(duì)傳入其中的對(duì)象執(zhí)行了一次淺復(fù)制。
  [注意]原型式繼承要求必須有一個(gè)對(duì)象可以作為另一個(gè)對(duì)象的基礎(chǔ),如果有這么一個(gè)對(duì)象的話,可以把它傳遞給object()函數(shù),然后再根據(jù)具體需求對(duì)得到的對(duì)象加以修改即可

function object(o){
  function F(){};
  F.prototype = o;
  return new F();
}
var person = {
  name: "Nicholas",
  friends: ["Shelby","Court","Van"]
};
var anotherPerson = object(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");

var yetAnotherPerson = object(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");

alert(person.friends);//"Shelby,Court,Van,Rob,Barbie"

【4.1】【Object.create()方法】:ECMAScript5新增Object.create()方法規(guī)范化了原型式繼承。這個(gè)方法接收兩個(gè)參數(shù):一個(gè)用作新對(duì)象原型的對(duì)象和(可選的)一個(gè)為新對(duì)象定義額外屬性的對(duì)象。在傳入一個(gè)參數(shù)情況下,Object.create()與object()方法的行為相同

function object(o){
 function F(){};
 F.prototype = o;
 return new F();
}
var person = {
 name: "Nicholas",
 friends:["Shelby","Court","Van"]
};
var anotherPerson = Object.create(person);
anotherPerson.name = "Greg";
anotherPerson.friends.push("Rob");
var yetAnotherPerson = object(person);
yetAnotherPerson.name = "Linda";
yetAnotherPerson.friends.push("Barbie");
alert(person.friends);//"Shelby,Court,Van,Rob,Barbie"

[注意]Object.create()方法的第二個(gè)參數(shù)與Object.defineProperties()方法的第二個(gè)參數(shù)格式相同:每個(gè)屬性都是通過(guò)自己的描述符定義的。以這種方式指定的任何屬性都會(huì)覆蓋原型對(duì)象上的同名屬性。

var person = {
 name: "Nicholas",
 friends:["Shelby","Court","Van"]
};
var anotherPerson = Object.create(person,{
 name: {
  value: "Greg"
 }
});
alert(anotherPerson.name);//"Greg" 

【4.2】低版本瀏覽器下兼容Object.create()方法

if(typeof Object.create != "function"){
 (function(){
  var F = function(){};
  Object.create = function(o){
   if(arguments.length > 1){
    throw Error('Second argument noe supported');
   }
   if(o === null){
    throw Error("Cannot set a null [[Prototype]]");
   }
   if(typeof o != 'Object'){
    throw TypeError("Arguments must be an object");
   }
   F.prototype = o;
   return new F();
  }
 })();
} 

5、【寄生式繼承】創(chuàng)建一個(gè)僅用于封裝繼承過(guò)程的函數(shù),該函數(shù)在內(nèi)部以某種方式來(lái)增強(qiáng)對(duì)象,最后再像真的是它做了所有工作一樣返回對(duì)象
[缺點(diǎn)]無(wú)法實(shí)現(xiàn)函數(shù)復(fù)用

function object(o){
 function F(){};
 F.prototype = o;
 return new F();
}
function createAnother(original){
 var clone = object(original);//通過(guò)調(diào)用函數(shù)創(chuàng)建一個(gè)新對(duì)象
 clone.sayHi = function(){ //以某種方式來(lái)增強(qiáng)這個(gè)對(duì)象
  alert("hi");
 };
 return clone;//返回這個(gè)對(duì)象
}
var person = {
 name: "Nicholas",
 friends: ["Shelby","Court","Van"]
};
var anotherPerson = createAnother(person);
anotherPerson.sayHi();//"hi"

6、【寄生組合式繼承】通過(guò)借用構(gòu)造函數(shù)來(lái)繼承屬性,通過(guò)原型鏈的混成形式來(lái)繼承方法。其背后的基本思路是:不必為了指定子類型的原型而調(diào)用超類型的構(gòu)造函數(shù),所需的無(wú)非就是超類型原型的一個(gè)副本而已。本質(zhì)上,就是使用寄生式繼承來(lái)繼承超類型的原型,然后再將結(jié)果指定給子類型的原型。寄生組合式繼承是引用類型最理想的繼承范式。

//這個(gè)例子中的高效率體現(xiàn)在它只調(diào)用了一次Super構(gòu)造函數(shù),并且因此避免了在SubType.prototype上面創(chuàng)建不必要的、多余的屬性。與此同時(shí),原型鏈還能保持不變。
function object(o){
 function F(){};
 F.prototype = o;
 return new F();
}
function inheritPrototype(subType,superType){
 var prototype = object(superType.prototype);//創(chuàng)建對(duì)象
 prototype.constructor = subType;//增強(qiáng)對(duì)象
 subType.prototype = prototype;//指定對(duì)象
}
function SuperType(name){
 this.name = name;
 this.colors = ["red","blue","green"];
}
SuperType.prototype.sayName = function(){
 alert(this.name);
};
function SubType(name,age){
 SuperType.call(this,name);
 this.age = age;
}
inheritPrototype(SubType,SuperType);
SubType.prototype.sayAge = function(){
 alert(this.age);
}

以上就是本文的全部?jī)?nèi)容,javascript實(shí)現(xiàn)繼承的方式,感謝大家的閱讀,小編會(huì)再接再厲!

相關(guān)文章

  • uniapp中安裝axios并解決跨域問(wèn)題小結(jié)

    uniapp中安裝axios并解決跨域問(wèn)題小結(jié)

    跨域(Cross-Origin)是指在瀏覽器中,當(dāng)前網(wǎng)頁(yè)的協(xié)議、域名或端口與請(qǐng)求目標(biāo)的協(xié)議、域名或端口不相同,即存在跨域請(qǐng)求的情況,這篇文章主要介紹了uniapp中安裝axios并解決跨域問(wèn)題小結(jié),需要的朋友可以參考下
    2024-05-05
  • 簡(jiǎn)單的JavaScript互斥鎖分享

    簡(jiǎn)單的JavaScript互斥鎖分享

    這篇文章主要介紹了簡(jiǎn)單的JavaScript互斥鎖的相關(guān)資料,需要的朋友可以參考下
    2014-02-02
  • 微信小程序頁(yè)面間傳值與頁(yè)面取值操作實(shí)例分析

    微信小程序頁(yè)面間傳值與頁(yè)面取值操作實(shí)例分析

    這篇文章主要介紹了微信小程序頁(yè)面間傳值與頁(yè)面取值操作,結(jié)合實(shí)例形式分析了微信小程序頁(yè)面間傳值及頁(yè)面取值操作相關(guān)實(shí)現(xiàn)技巧與操作注意事項(xiàng),需要的朋友可以參考下
    2019-04-04
  • JavaScript中this詳解

    JavaScript中this詳解

    都說(shuō) JavaScript 是一種很靈活的語(yǔ)言,這其實(shí)也可以說(shuō)它是一個(gè)混亂的語(yǔ)言。它把函數(shù)式編程和面向?qū)ο缶幊挑酆弦黄?,再加上?dòng)態(tài)語(yǔ)言特性,簡(jiǎn)直強(qiáng)大無(wú)比,下面小編給大家介紹Javascript中this詳解,需要的小伙伴可以來(lái)參考下
    2015-09-09
  • 詳解微信小程序之scroll-view的flex布局問(wèn)題

    詳解微信小程序之scroll-view的flex布局問(wèn)題

    這篇文章主要介紹了詳解微信小程序之scroll-view的flex布局問(wèn)題,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-01-01
  • js實(shí)現(xiàn)簡(jiǎn)潔的TAB滑動(dòng)門效果代碼

    js實(shí)現(xiàn)簡(jiǎn)潔的TAB滑動(dòng)門效果代碼

    這篇文章主要介紹了js實(shí)現(xiàn)簡(jiǎn)潔的TAB滑動(dòng)門效果代碼,通過(guò)簡(jiǎn)單的JavaScript自定義函數(shù)動(dòng)態(tài)遍歷頁(yè)面元素實(shí)現(xiàn)tab滑動(dòng)切換的功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-09-09
  • 詳解JS瀏覽器事件模型

    詳解JS瀏覽器事件模型

    這篇文章主要介紹了JS瀏覽器事件模型,對(duì)時(shí)間模型感興趣的同學(xué),可以參考下
    2021-05-05
  • js控制文本框禁止輸入特殊字符詳解

    js控制文本框禁止輸入特殊字符詳解

    本文主要介紹了js控制文本框禁止輸入特殊字符的相關(guān)知識(shí)。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-04-04
  • 前端大屏適配的三種解決方案總結(jié)

    前端大屏適配的三種解決方案總結(jié)

    在日常前端開(kāi)發(fā)中,大屏項(xiàng)目是每個(gè)前端開(kāi)發(fā)者必備技能,但是目前設(shè)備尺寸大小和分辨率都不相同,所以大屏適配成了一個(gè)頭疼的問(wèn)題,所以下面這篇文章主要給大家介紹了關(guān)于前端大屏適配的三種解決方案,需要的朋友可以參考下
    2024-03-03
  • JavaScript實(shí)戰(zhàn)之菜單特效

    JavaScript實(shí)戰(zhàn)之菜單特效

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)戰(zhàn)之菜單特效實(shí)現(xiàn)代碼,具有與一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-08-08

最新評(píng)論

静海县| 济南市| 巨鹿县| 西青区| 南和县| 琼海市| 凌源市| 永福县| 阿荣旗| 廉江市| 乌鲁木齐县| 建平县| 西林县| 滦平县| 泰和县| 徐闻县| 贡觉县| 景宁| 安庆市| 巴塘县| 深泽县| 武冈市| 河东区| 大名县| 东港市| 盘锦市| 麻城市| 始兴县| 巴里| 阜阳市| 莲花县| 沂水县| 岳池县| 蓬溪县| 称多县| 甘肃省| 淳化县| 高碑店市| 如东县| 松江区| 娱乐|