欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Javascript中的prototype與繼承

 更新時間:2017年02月06日 10:13:43   作者:285267128  
本文主要介紹了Javascript中的prototype與繼承,具有一定的參考價值,下面跟著小編一起來看下吧

通常來說,javascript中的對象就是一個指向prototype的指針和一個自身的屬性列表。javascript創(chuàng)建對象時采用了寫時復(fù)制的理念。

只有構(gòu)造器才具有prototype屬性,原型鏈繼承就是創(chuàng)建一個新的指針,指向構(gòu)造器的prototype屬性。

prototype屬性之所以特別,是因為javascript時讀取屬性時的遍歷機(jī)制決定的。本質(zhì)上它就是一個普通的指針。

構(gòu)造器包括:

1.Object
2.Function
3.Array
4.Date
5.String

下面我們來舉一些例子吧

//每個function都有一個默認(rèn)的屬性prototype,而這個prototype的constructor默認(rèn)指向這個函數(shù)
//注意Person.constructor 不等于 Person.prototype.constructor. Function實例自帶constructor屬性
functionPerson(name){
this.name = name;
};
Person.prototype.getName =function(){
returnthis.name;
};
var p =newPerson("ZhangSan");
console.log(Person.prototype.constructor===Person);// true
console.log(p.constructor===Person);// true ,這是因為p本身不包含constructor屬性,所以這里其實調(diào)用的是Person.prototype.constructor

我們的目的是要表示

1. 表明Person繼承自Animal

2. 表明p2是Person的實例

我們修改一下prototype屬性的指向,讓Person能獲取Animal中的prototype屬性中的方法。也就是Person繼承自Animal(人是野獸) 

functionPerson(name){
this.name = name;
};
Person.prototype.getName =function(){
returnthis.name;
};
var p1 =newPerson("ZhangSan");
console.log(p.constructor===Person);// true
console.log(Person.prototype.constructor===Person);// true
functionAnimal(){}
Person.prototype =newAnimal();//之所以不采用Person.prototype = Animal.prototype,是因為new 還有其他功能,最后總結(jié)。
var p2 =newPerson("ZhangSan");
//(p2 -> Person.prototype -> Animal.prototype, 所以p2.constructor其實就是Animal.prototype.constructor)
console.log(p2.constructor===Person);// 輸出為false ,但我們的本意是要這里為true的,表明p2是Person的實例。此時目的1達(dá)到了,目的2沒達(dá)到。

但如果我們這么修正

Person.prototype = new Animal();
Person.prototype.constructor = Person;

這時p2.consturctor是對了,指向的是Person,表示p2是Person類的實例,但是新問題出現(xiàn)了。此時目的2達(dá)到了,目的1沒達(dá)到。

目的1和目的2此時互相矛盾,是因為此時prototype表達(dá)了矛盾的兩個意思,

1. 表示父類是誰

2. 作為自己實例的原型來復(fù)制

因此我們不能直接使用prototype屬性來表示父類是誰,而是用getPrototypeOf()方法來知道父類是誰。 

Person.prototype =newAnimal();
Person.prototype.constructor=Person;
var p2 =newPerson("ZhangSan");
p2.constructor//顯示 function Person() {}
Object.getPrototypeOf(Person.prototype).constructor//顯示 function Animal() {}

就把這兩個概念給分開了 ,其實通過使用 hasOwnProperty()方法,什么時候訪問的是實例屬性,什么時候訪問的是原型屬性就一清二楚了

new做了哪些事情?

當(dāng)代碼var p = new Person()執(zhí)行時,new 做了如下幾件事情:

創(chuàng)建一個空白對象

創(chuàng)建一個指向Person.prototype的指針

將這個對象通過this關(guān)鍵字傳遞到構(gòu)造函數(shù)中并執(zhí)行構(gòu)造函數(shù)。

具體點來說,在下面這段代碼中,

Person.prototype.getName =function(){}

如果我們通過

var person =newPerson();
其實類似于
var person =newObject();
person.getName =Person.prototype.getName;

因此通過person.getName()調(diào)用方法時,this指向的是這個新創(chuàng)建的對象,而不是prototype對象。

這其實在給現(xiàn)有函數(shù)加上新功能的情況下會用到,我們可以這么擴(kuò)展現(xiàn)有的方法:

//function myFunc 的寫法基本上等于 var myFunc = new Function();
function myFunc (){
}
myFunc =function(func){
  //可以在這里做點其他事情
returnfunction(){
     //可以在這里做點其他事情
return func.apply(this,arguments);
}
}(myFunc)

也可以在Function.prototype方法里直接通過this來訪問上面代碼的myFunc所指向的對象

function myFunc (){
}
if(!Function.prototype.extend){
Function.prototype.extend =function(){
var func =this;
returnfunction(){
func.apply(this,arguments);
}
}
};
var myFunc = myFunc.extend();

總結(jié)一下

如果采用Person.prototype  = Animal.prototype來表示Person繼承自Animal, instanceof方法也同樣會顯示p也是Animal的實例,返回為true.

之所以不采用此方法,是因為下面兩個原因:

1.new 創(chuàng)建了一個新對象,這樣就避免了設(shè)置Person.prototype.constructor = Person 的時候也會導(dǎo)致Animal.prototype.constructor的值變?yōu)镻erson,而是動態(tài)給這個新創(chuàng)建的對象一個constructor實例屬性。這樣實例上的屬性constructor就覆蓋了Animal.prototype.constructor,這樣Person.prototype.constructor和Animal.prototype.contructor就分開了。

2.Animal自身的this對象的屬性沒辦法傳遞給Person

但是像下面這樣直接調(diào)用構(gòu)造函數(shù)又可能失敗,或者產(chǎn)生其他影響。

Person.prototype =newAnimal();

為了避免這種情況,所以我們引入了一個中間函數(shù)。所以正確的做法應(yīng)該是

Person.prototype =(funtion(){
   function F(){};
   F.prototype =Animal.prototype
   returnnew F();
})()

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • TypeScript工具類 Partial 和 Required 的場景分析

    TypeScript工具類 Partial 和 Required 的場景分析

    這篇文章主要介紹了TypeScript工具類 Partial 和 Required 的詳細(xì)講解,本文通過場景描述給大家詳細(xì)講解工具類的使用,結(jié)合實例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • JS打印彩色菱形的實例代碼

    JS打印彩色菱形的實例代碼

    本文通過一段簡單的實例代碼給大家介紹js實現(xiàn)打印彩色菱形的方法,非常不錯,具有一定的參考借鑒價值,需要的朋友參考下吧
    2018-08-08
  • js里的prototype使用示例

    js里的prototype使用示例

    Object對象是common的原型,Object對象的屬性和方法復(fù)制到了common上
    2010-11-11
  • 原生JS實現(xiàn)圖片輪播與淡入效果的簡單實例

    原生JS實現(xiàn)圖片輪播與淡入效果的簡單實例

    下面小編就為大家?guī)硪黄鶭S實現(xiàn)圖片輪播與淡入效果的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • 如何使用ES6的class類繼承來實現(xiàn)絢麗小球效果

    如何使用ES6的class類繼承來實現(xiàn)絢麗小球效果

    JS是由ES(ECMAScript)、DOM(瀏覽器文檔對象)、BOM(瀏覽器對象模型)組成,這篇文章主要給大家介紹了關(guān)于如何使用ES6的class類繼承來實現(xiàn)絢麗小球效果的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • 前端頁面適配之postcss-px-to-viewport實現(xiàn)步驟

    前端頁面適配之postcss-px-to-viewport實現(xiàn)步驟

    postcss-px-to-viewport是一個PostCSS插件,它可以將px單位轉(zhuǎn)換為視口單位(vw、vh?或?vmin),這篇文章主要給大家介紹了關(guān)于前端頁面適配之postcss-px-to-viewport的實現(xiàn)步驟,需要的朋友可以參考下
    2024-03-03
  • Bootstrap列表組學(xué)習(xí)使用

    Bootstrap列表組學(xué)習(xí)使用

    這篇文章主要為大家詳細(xì)介紹了Bootstrap列表組的學(xué)習(xí)使用,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • 如何防止回車(enter)鍵提交表單

    如何防止回車(enter)鍵提交表單

    這篇文章主要介紹了如何防止回車(enter)鍵提交表單的方法,需要的朋友可以參考下
    2014-05-05
  • Bootstrap 附加導(dǎo)航(Affix)插件實例詳解

    Bootstrap 附加導(dǎo)航(Affix)插件實例詳解

    附加導(dǎo)航(Affix)插件允許某個 <div> 固定在頁面的某個位置。接下來通過本文給大家介紹Bootstrap 附加導(dǎo)航(Affix)插件實例詳解,感興趣的朋友一起看看吧
    2016-06-06
  • 實現(xiàn)web打印的各種方法介紹及實現(xiàn)代碼

    實現(xiàn)web打印的各種方法介紹及實現(xiàn)代碼

    web的打印方法具我自己懂得知道的有:JQuery插件Jqprint實現(xiàn);JQery打印插件PrintArea實現(xiàn)網(wǎng)頁打印;CSS控制網(wǎng)頁打印樣式,本文詳細(xì)介紹實現(xiàn)步驟,感興趣的朋友可以了解下
    2013-01-01

最新評論