国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js繼承

gaosboy / 2565人閱讀

摘要:使用這種方式繼承的好處可以在子類型構(gòu)造函數(shù)中向超類型構(gòu)造函數(shù)傳遞參數(shù)。下面來看一個(gè)例子繼承屬性繼承方法拼接原型鏈我們看到現(xiàn)在實(shí)例可以訪問的超類型的原型上的方法了構(gòu)造函數(shù)定義了兩個(gè)屬性和。

在了解了js 中的原型鏈之后 (https://segmentfault.com/a/11...),我們再來看看js 中的幾種實(shí)現(xiàn)繼承的方式

一 借用構(gòu)造函數(shù)實(shí)現(xiàn)繼承

為了解決包含引用類型值的原型屬性會(huì)被所有實(shí)例共享的問題,大神們發(fā)明了在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型構(gòu)造函數(shù)然后通過apply()和call()方法在(將來)新創(chuàng)建的對象上執(zhí)行構(gòu)造函數(shù)的方式來實(shí)現(xiàn)繼承,如下

function SuperType() {
    this.colors = ["red", "blue", "green"];
}
function SubType() {
//調(diào)用SuperType 并且通過call()方法修正this指向  
SuperType.call(this);
 }
var instance1 = new SubType();
instance1.colors.push("black");
//"red,blue,green,black"
alert(instance1.colors);
//"red,blue,green"
var instance2 = new SubType();
alert(instance2.colors);

以上例子中在SubType()調(diào)用了SuperType()構(gòu)造函數(shù)。通過使用call()方法(或apply()方法也可以),我們實(shí)際上是在(未來將要)新創(chuàng)建的SubType實(shí)例的環(huán)境下調(diào)用了SuperType構(gòu)造函數(shù)。這樣一來,就會(huì)在新SubType對象上執(zhí)行SuperType()函數(shù)中定義的所有對象初始化代碼。結(jié)果,SubType的每個(gè)實(shí)例就都會(huì)具有自己的colors屬性的副本了(互不影響)。

使用這種方式繼承的好處:

可以在子類型構(gòu)造函數(shù)中向超類型構(gòu)造函數(shù)傳遞參數(shù)。如下

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

SuperType只接受一個(gè)參數(shù)name,該參數(shù)會(huì)直接賦給一個(gè)屬性。在SubType構(gòu)造函數(shù)內(nèi)部調(diào)用SuperType構(gòu)造函數(shù)時(shí),實(shí)際上是為SubType的實(shí)例設(shè)置了name屬性。為了確保SuperType構(gòu)造函數(shù)不會(huì)重寫子類型的屬性,可以在調(diào)用超類型構(gòu)造函數(shù)后,再添加應(yīng)該在子類型中定義的屬性。

使用這種方式繼承的壞處:

1.方法都在構(gòu)造函數(shù)中定義
2.在超類型的原型中定義的方法,對子類型而言也是不可見的 如下

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


我們在控制臺可以看到子類型原型中無法獲取超類型的a方法

二 組合繼承

將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合到一塊,從而發(fā)揮二者之長的一種繼承模式,主要的思路是使用原型鏈實(shí)現(xiàn)對原型屬性和方法的繼承,而通過借用構(gòu)造函數(shù)來實(shí)現(xiàn)對實(shí)例屬性的繼承。這樣,既通過在原型上定義方法實(shí)現(xiàn)了函數(shù)復(fù)用,又能夠保證每個(gè)實(shí)例都有它自己的屬性。下面來看一個(gè)例子

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


我們看到現(xiàn)在實(shí)例可以訪問的超類型的原型上的方法了
SuperType構(gòu)造函數(shù)定義了兩個(gè)屬性:name和colors。SuperType的原型定義了一個(gè)方法sayName()。Sub-Type構(gòu)造函數(shù)在調(diào)用SuperType構(gòu)造函數(shù)時(shí)傳入了name參數(shù),緊接著又定義了它自己的屬性age。然后,將SuperType的實(shí)例賦值給SubType的原型,然后又在該新原型上定義了方法sayAge()。這樣一來,就可以讓兩個(gè)不同的SubType實(shí)例既分別擁有自己屬性——包括colors屬性,又可以使用相同的方法了這種方式是目前js實(shí)現(xiàn)繼承使用的最常見的方式

使用這種繼承方式的不足

SubType.prototype = new SuperType()的確會(huì)創(chuàng)建一個(gè)關(guān)聯(lián)到SubType.prototype 的新對象。但是它使用了SubType(..)的“構(gòu)造函數(shù)調(diào)用”,如果函數(shù)SubType有一些副作用(比如寫日志、修改狀態(tài)、注冊到其他對象、給this添加數(shù)據(jù)屬性,等等)的話,就會(huì)影響到SubType()的“后代”。

改進(jìn)方法
function SuperType(name) {
  this.name = name;
  this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function() {
  alert(this.name);
};
function SubType(name, age) { 
  //繼承name屬性    
  SuperType.call(this, name);    
  this.age = age;
}
//使用Object.create 生成對象來代替new SuperType()生成的對象

SubType.prototype = Object.create(SuperType.prototype);
SubType.prototype.sayAge = function() {
  alert(this.age);
};
var instance1 = new SubType("Nicholas", 29);
console.log(instance1 );


這樣可以避免對SubType后代的影響

// ES6之前需要拋棄默認(rèn)的SubType.prototype
SubType.ptototype = Object.create( SuperType.prototype );
// ES6開始可以直接修改現(xiàn)有的
SubType.prototypeObject.setPrototypeOf( SubType.prototype, SuperType.prototype );

可以參考(https://www.liaoxuefeng.com/w...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/92743.html

相關(guān)文章

  • JS中的繼承(上)

    摘要:中的繼承上學(xué)過或者之類語言的同學(xué)應(yīng)該會(huì)對的繼承感到很困惑不要問我怎么知道的的繼承主要是基于原型的對的原型感興趣的同學(xué)可以了解一下我之前寫的中的原型對象相信很多同學(xué)也跟我一樣剛開始接觸的面向?qū)ο缶幊痰臅r(shí)候都抱著一種排斥的心態(tài)為什么這么 JS中的繼承(上) 學(xué)過java或者c#之類語言的同學(xué),應(yīng)該會(huì)對js的繼承感到很困惑--不要問我怎么知道的,js的繼承主要是基于原型(prototype)...

    Fundebug 評論0 收藏0
  • JavaScript繼承方式詳解

    摘要:可以通過構(gòu)造函數(shù)和原型的方式模擬實(shí)現(xiàn)類的功能。原型式繼承與類式繼承類式繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型的構(gòu)造函數(shù)。寄生式繼承這種繼承方式是把原型式工廠模式結(jié)合起來,目的是為了封裝創(chuàng)建的過程。 js繼承的概念 js里常用的如下兩種繼承方式: 原型鏈繼承(對象間的繼承) 類式繼承(構(gòu)造函數(shù)間的繼承) 由于js不像java那樣是真正面向?qū)ο蟮恼Z言,js是基于對象的,它沒有類的概念。...

    Yangyang 評論0 收藏0
  • JS面向?qū)ο笾?【繼承

    摘要:首先為了模擬類創(chuàng)建對象的功能搞出了構(gòu)造函數(shù)。也就是名字膚色膚色這里是繼承里的自有屬性生命值這里繼承的共有屬性的方法攻擊力兵種美國大兵攻擊防御死亡膚色 JS面向?qū)ο笾?【繼承】 我們已經(jīng)準(zhǔn)備了很多前置知識,包括 原型鏈,對象和對象之間的關(guān)系 this,對象和函數(shù)之間的關(guān)系 new, 用函數(shù)批量創(chuàng)建特定的對象的語法糖 JS面向?qū)ο蟮那笆澜裆?我們說,面向?qū)ο笫且环N寫代碼的套路。因?yàn)槿?..

    genefy 評論0 收藏0
  • JS基礎(chǔ)(對象創(chuàng)建,構(gòu)造函數(shù)、原型、實(shí)例之間關(guān)系,繼承方式)

    摘要:對象創(chuàng)建的三種方式字面量創(chuàng)建方式系統(tǒng)內(nèi)置構(gòu)造函數(shù)方式自定義構(gòu)造函數(shù)構(gòu)造函數(shù)原型實(shí)例之間的關(guān)系實(shí)例是由構(gòu)造函數(shù)實(shí)例化創(chuàng)建的,每個(gè)函數(shù)在被創(chuàng)建的時(shí)候,都會(huì)默認(rèn)有一個(gè)對象。 JS 對象創(chuàng)建的三種方式 //字面量創(chuàng)建方式 var person= { name:jack } //系統(tǒng)內(nèi)置構(gòu)造函數(shù)方式 var person= new Object(); person.name = jack; ...

    PAMPANG 評論0 收藏0
  • JS專題之繼承

    摘要:構(gòu)造函數(shù)所以,就有了畸形的繼承方式原型鏈繼承三原型鏈繼承改變構(gòu)造函數(shù)的原型對象繼承了屬性以上例子中,暴露出原型鏈繼承的兩個(gè)問題包含引用類型數(shù)據(jù)的原型屬性,會(huì)被所有實(shí)例共享,基本數(shù)據(jù)類型則不會(huì)。 前言 眾所周知,JavaScript 中,沒有 JAVA 等主流語言類的概念,更沒有父子類繼承的概念,而是通過原型對象和原型鏈的方式實(shí)現(xiàn)繼承。 于是,我們這一篇講一講 JS 中的繼承(委托)。 ...

    rollback 評論0 收藏0
  • js原型和繼承

    摘要:舉例說明組合繼承組合繼承利用原型鏈借用構(gòu)造函數(shù)的模式解決了原型鏈繼承和類式繼承的問題。示例組合式繼承是比較常用的一種繼承方法,其背后的思路是使用原型鏈實(shí)現(xiàn)對原型屬性和方法的繼承,而通過借用構(gòu)造函數(shù)來實(shí)現(xiàn)對實(shí)例屬性的繼承。 對js原型和繼承的理解一直處于不懂-懂-不懂-懂-不懂。。。的無限循環(huán)之中,本來打算只是簡單總結(jié)下js繼承方式,可看了些網(wǎng)上的資料后,發(fā)現(xiàn)又不懂繼承了。。。這篇文章只...

    Hujiawei 評論0 收藏0

發(fā)表評論

0條評論

gaosboy

|高級講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<