国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > JavaScript > 正文

Javascript中prototype與__proto__的關(guān)系詳解

2019-11-19 14:11:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

前言

學(xué)到原型的時(shí)候感覺頭都大了/(ㄒoㄒ)/~~ 尤其是prototype和__proto__ 傻傻分不清  通過(guò)多番查找資料,根據(jù)自己的理解,總結(jié)如下:

一、構(gòu)造函數(shù):

構(gòu)造函數(shù):通過(guò)new關(guān)鍵字可以用來(lái)創(chuàng)建特定類型的對(duì)象的函數(shù)。比如像Object和Array,兩者屬于內(nèi)置的原生的構(gòu)造函數(shù),在運(yùn)行時(shí)會(huì)自動(dòng)的出現(xiàn)在執(zhí)行環(huán)境中,可以直接使用。如下:

var arr = new Array();//使用Array構(gòu)造函數(shù)創(chuàng)建了一個(gè)array實(shí)例arrarr[0]="a";arr[1]="b";alert(arr);//a,bvar obj=new Object();//使用Object構(gòu)造函數(shù)創(chuàng)建了一個(gè)Object實(shí)例objobj.name="c";obj.age=12;alert(obj.name);//c

我們可以自定義的創(chuàng)建構(gòu)造函數(shù),并為其自定義屬性和方法,如:

//創(chuàng)建構(gòu)造函數(shù)Personfunction Person(name,age){ this.name=name; this.age=age; this.sayName=function(){ alert(this.name)// };}//使用new關(guān)鍵字,來(lái)生成Person實(shí)例var person1=new Person("Tom",22);var person2=new Person("Jerry",21);person1.sayName();//Tomperson2.sayName();//Jerry

注意以下幾點(diǎn):

  • 構(gòu)造函數(shù)的名字始終要以大寫字母開頭(主要是為了區(qū)別于非構(gòu)造函數(shù),也即是區(qū)別于普通函數(shù))
  • 構(gòu)造函數(shù)也就是函數(shù),定義構(gòu)造函數(shù)和定義普通函數(shù)的語(yǔ)法一樣。構(gòu)造函數(shù)和普通函數(shù)的區(qū)別在于:使用他們的方式不同。任何函數(shù)只要使用new操作符來(lái)調(diào)用,那他就可以作為構(gòu)造函數(shù);不使用new操作符來(lái)調(diào)用就是普通函數(shù)
function Person(name,age){ this.name=name; this.age=age; this.sayName=function(){ alert(this.name)// };}//當(dāng)做構(gòu)造函數(shù)使用var person=new Person("Tom",22);person.sayName();//Tom //當(dāng)做普通函數(shù)使用Person("Jerry",30);//添加到windowsayName();//Jerry 等同于window.sayName();

二、原型對(duì)象:

每個(gè)函數(shù)都有一個(gè)prototype屬性,它是一個(gè)指向原型對(duì)象的指針,原型對(duì)象在定義函數(shù)時(shí)同時(shí)被創(chuàng)建,原型對(duì)象的用途是包含所有實(shí)例共享的屬性和方法

function Person(){}//自定義原型對(duì)象的屬性和方法Person.prototype.name="Tom";Person.prototype.age=25;Person.prototype.sayName=function(){ alert(this.name);};//原型對(duì)象中的所有屬性和方法 都會(huì)自動(dòng)被所有實(shí)例所共享var person1=new Person();var person2=new Person();person1.sayName();//Tomperson2.sayName();//Tom

只要?jiǎng)?chuàng)建了一個(gè)新函數(shù),每個(gè)函數(shù)在創(chuàng)建之后都會(huì)獲得一個(gè)prototype的屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象(原型對(duì)象在定義函數(shù)時(shí)同時(shí)被創(chuàng)建),此原型對(duì)象又有一個(gè)名為“constructor”的屬性,反過(guò)來(lái)指向函數(shù)本身,達(dá)到一種循環(huán)指向,

如在上邊的例子中:alert(Person.prototype.constructor===Person);//會(huì)返回true

function Person(){}alert(Person.prototype.constructor===Person);//true

三、__proto__(注意這里proto左右兩邊都有兩個(gè)"_")

當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個(gè)新實(shí)例后,該實(shí)例的內(nèi)部將包含一個(gè)指針[[Prototype]],該指針指向創(chuàng)建它的構(gòu)造函數(shù)的原型,在腳本上沒(méi)有標(biāo)準(zhǔn)的方法來(lái)訪問(wèn)[[Prototype]],但大多數(shù)瀏覽器都支持通過(guò)__proto__來(lái)訪問(wèn)。

function Person(){}//自定義原型對(duì)象的屬性和方法Person.prototype.name="Tom";Person.prototype.age=25;Person.prototype.sayName=function(){ alert(this.name);};//原型對(duì)象中的所有屬性和方法 都會(huì)自動(dòng)被所有實(shí)例所共享var person1=new Person();var person2=new Person();person1.sayName();//Tomperson2.sayName();//Tomalert(person1.__proto__===Person.prototype);//true

以上述的示例代碼為例,各個(gè)對(duì)象之間的關(guān)系如下圖所示:

 

總結(jié):

①只要?jiǎng)?chuàng)建了一個(gè)函數(shù),該函數(shù)的原型對(duì)象也隨之同時(shí)被創(chuàng)建出來(lái),原型對(duì)象中的屬性和方法被經(jīng)由其相對(duì)應(yīng)的構(gòu)造函數(shù)所創(chuàng)建的實(shí)例所共享

②每個(gè)函數(shù)在創(chuàng)建之后都會(huì)獲得一個(gè)prototype的屬性,這個(gè)屬性指向該函數(shù)的原型對(duì)象

③每個(gè)對(duì)象的__proto__屬性都指向其構(gòu)造函數(shù)的原型

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)武林網(wǎng)的支持。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 兴城市| 高陵县| 达州市| 偏关县| 湘西| 大城县| 阿克苏市| 吴江市| 健康| 磴口县| 宜良县| 屏边| 江永县| 民乐县| 罗江县| 比如县| 乡城县| 仁怀市| 依兰县| 泰州市| 沐川县| 平南县| 定襄县| 云阳县| 平阳县| 清流县| 桐城市| 大新县| 龙山县| 洛隆县| 乌鲁木齐市| 阆中市| 滨州市| 六枝特区| 监利县| 鹤岗市| 临邑县| 崇明县| 黔西县| 乌鲁木齐县| 五台县|