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

Javascript中的prototype與繼承

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

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

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

prototype屬性之所以特別,是因?yàn)閖avascript時(shí)讀取屬性時(shí)的遍歷機(jī)制決定的。本質(zhì)上它就是一個(gè)普通的指針。

構(gòu)造器包括:

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

下面我們來舉一些例子吧

//每個(gè)function都有一個(gè)默認(rèn)的屬性prototype,而這個(gè)prototype的constructor默認(rèn)指向這個(gè)函數(shù)
//注意Person.constructor 不等于 Person.prototype.constructor. Function實(shí)例自帶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 ,這是因?yàn)閜本身不包含constructor屬性,所以這里其實(shí)調(diào)用的是Person.prototype.constructor

我們的目的是要表示

1. 表明Person繼承自Animal

2. 表明p2是Person的實(shí)例

我們修改一下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,是因?yàn)閚ew 還有其他功能,最后總結(jié)。
var p2 =newPerson("ZhangSan");
//(p2 -> Person.prototype -> Animal.prototype, 所以p2.constructor其實(shí)就是Animal.prototype.constructor)
console.log(p2.constructor===Person);// 輸出為false ,但我們的本意是要這里為true的,表明p2是Person的實(shí)例。此時(shí)目的1達(dá)到了,目的2沒達(dá)到。

但如果我們這么修正

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

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

目的1和目的2此時(shí)互相矛盾,是因?yàn)榇藭r(shí)prototype表達(dá)了矛盾的兩個(gè)意思,

1. 表示父類是誰

2. 作為自己實(shí)例的原型來復(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() {}

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

new做了哪些事情?

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

創(chuàng)建一個(gè)空白對(duì)象

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

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

具體點(diǎn)來說,在下面這段代碼中,

Person.prototype.getName =function(){}

如果我們通過

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

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

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

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

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

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方法也同樣會(huì)顯示p也是Animal的實(shí)例,返回為true.

之所以不采用此方法,是因?yàn)橄旅鎯蓚€(gè)原因:

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

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

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

Person.prototype =newAnimal();

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

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

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

相關(guān)文章

  • json格式的時(shí)間顯示為正常年月日的方法

    json格式的時(shí)間顯示為正常年月日的方法

    json格式的時(shí)間顯示為:Date(1377828670436)需要轉(zhuǎn)換為正常年月日,具體的實(shí)現(xiàn)思路及代碼如下,感興趣的朋友可以參考下
    2013-09-09
  • javascript淘寶主圖放大鏡功能

    javascript淘寶主圖放大鏡功能

    這篇文章主要為大家詳細(xì)介紹了javascript淘寶主圖放大鏡功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Ionic快速安裝教程

    Ionic快速安裝教程

    Ionic 是目前最有潛力的一款 HTML5 手機(jī)應(yīng)用開發(fā)框架。通過 SASS 構(gòu)建應(yīng)用程序,它 提供了很多 UI 組件來幫助開發(fā)者開發(fā)強(qiáng)大的應(yīng)用。接下來小編給大家介紹如何安裝 Ionic 在自己的電腦上搭建一個(gè)簡單的小應(yīng)用,感興趣的朋友一起看看吧
    2016-06-06
  • three.js實(shí)現(xiàn)圓柱體

    three.js實(shí)現(xiàn)圓柱體

    這篇文章主要為大家詳細(xì)介紹了three.js實(shí)現(xiàn)圓柱體的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • javascript實(shí)現(xiàn)選中復(fù)選框后相關(guān)輸入框變灰不可用的方法

    javascript實(shí)現(xiàn)選中復(fù)選框后相關(guān)輸入框變灰不可用的方法

    這篇文章主要介紹了javascript實(shí)現(xiàn)選中復(fù)選框后相關(guān)輸入框變灰不可用的方法,涉及javascript針對(duì)頁面元素屬性的相關(guān)操作技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-08-08
  • 微信小程序錯(cuò)誤this.setData報(bào)錯(cuò)及解決過程

    微信小程序錯(cuò)誤this.setData報(bào)錯(cuò)及解決過程

    這篇文章主要介紹了微信小程序錯(cuò)誤this.setData報(bào)錯(cuò)及解決過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • JavaScript詞法作用域與調(diào)用對(duì)象深入理解

    JavaScript詞法作用域與調(diào)用對(duì)象深入理解

    關(guān)于 Javascript 的函數(shù)作用域、調(diào)用對(duì)象和閉包之間的關(guān)系很微妙,關(guān)于它們的文章已經(jīng)有很多,本文做了一些總結(jié),需要的朋友可以參考下
    2012-11-11
  • 基于input框覆蓋掉數(shù)字英文的實(shí)例講解

    基于input框覆蓋掉數(shù)字英文的實(shí)例講解

    下面小編就為大家?guī)硪黄趇nput框覆蓋掉數(shù)字英文的實(shí)例講解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-07-07
  • 使用forEach和ES6實(shí)現(xiàn)tab切換的示例代碼

    使用forEach和ES6實(shí)現(xiàn)tab切換的示例代碼

    tab切換在很多菜單欄中都可以用到,本文主要介紹了使用forEach和ES6實(shí)現(xiàn)tab切換的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 微信接入之獲取用戶頭像的方法步驟

    微信接入之獲取用戶頭像的方法步驟

    這篇文章主要介紹了微信接入之獲取用戶頭像的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09

最新評(píng)論

康平县| 福州市| 永和县| 洮南市| 黎平县| 织金县| 毕节市| 元谋县| 阿图什市| 吴忠市| 托里县| 武汉市| 梁河县| 龙州县| 改则县| 厦门市| SHOW| 左权县| 巫山县| 兴宁市| 南和县| 黄浦区| 青铜峡市| 乌审旗| 芦溪县| 垫江县| 将乐县| 新晃| 台前县| 商水县| 措美县| 商丘市| 外汇| 牡丹江市| 绍兴市| 独山县| 龙里县| 浦北县| 双鸭山市| 安吉县| 高平市|