JavaScript原型與實(shí)例詳解
構(gòu)造函數(shù) 實(shí)例 原型三者的關(guān)系
1.任何函數(shù)都有一個(gè)prototype屬性,該屬性是一個(gè)對(duì)象
function F () {} console.log(F.prototype) // => object //原型對(duì)象 F.prototype.sayHi = function () { console.log('hi!') }
2.構(gòu)造函數(shù)的prototype對(duì)象默認(rèn)都有一個(gè)constructor屬性,指向prototype對(duì)象所在函數(shù)
console.log(F.constructor === F) // => true //表示這個(gè)
3.通過(guò)構(gòu)造函數(shù)得到的實(shí)例對(duì)象內(nèi)部會(huì)包含一個(gè)指向構(gòu)造函數(shù)的prototype對(duì)象的指針_proto_
var instance = new F() console.log(instance.__proto__ === F.prototype) // => true
意思是用當(dāng)前構(gòu)造函數(shù)創(chuàng)建的實(shí)例對(duì)象內(nèi)部都包含一個(gè)指針,這個(gè)指針就是_proto_
,然后這個(gè)指針是指向構(gòu)造函數(shù)的prototype對(duì)象的
因此我們可以直接用實(shí)例訪問(wèn)原型對(duì)象上的成員
例:
instance.sayHi() // => 打印hi!
注意
_proto_
是一個(gè)非標(biāo)準(zhǔn)屬性
prototype屬性
Javascript 規(guī)定,每一個(gè)構(gòu)造函數(shù)都有一個(gè) prototype 屬性,指向另一個(gè)對(duì)象。
這個(gè)對(duì)象的所有屬性和方法,都會(huì)被構(gòu)造函數(shù)的實(shí)例繼承。
這也就意味著,我們可以把所有對(duì)象實(shí)例需要共享的屬性和方法直接定義在prototype對(duì)象上。
例子:
function Person (name, age) { this.name = name this.age = age } console.log(Person.prototype)//打印原型 Person.prototype.type = 'human'//將human掛載到原型對(duì)象的屬性上 Person.prototype.sayName = function () {//還可以定義函數(shù) console.log(this.name) } let p1 = new Person(...) let p2 = new Person(...) console.log(p1.sayName === p2.sayName) // => true
我們可以看到console.log(p1.sayName === p2.sayName)
這行代碼打印的結(jié)果是true
這是因?yàn)樗袑?shí)例的type
屬性和sayName()
方法都是一個(gè)同一個(gè)內(nèi)存地址,都是指向prototype
對(duì)象,因此提高了運(yùn)行效率
屬性或成員的搜索原則
我們知道了多個(gè)實(shí)例對(duì)象是可以共享原型對(duì)象中的屬性或成員的,那么js中是怎么實(shí)現(xiàn)這個(gè)共享機(jī)制的呢?
這就不得不提到屬性的搜索原則了
每當(dāng)代碼讀取某個(gè)實(shí)例對(duì)象的某個(gè)屬性時(shí),都會(huì)執(zhí)行一次搜索,搜索目標(biāo)是具有給定名字的屬性或者成員
搜索過(guò)程如下:
1.首先從對(duì)象實(shí)例本身開(kāi)始搜索
2.如果在實(shí)例對(duì)象中找到了具有給定名字的屬性,則返回該屬性的值
3.如果沒(méi)有找到,則繼續(xù)搜索實(shí)例對(duì)象中含有的指針(上文中講過(guò))指向的原型對(duì)象,在原型對(duì)象中查找具有給定名字的屬性
4.如果在原型對(duì)象中找到了這個(gè)屬性,則返回該屬性的值
在執(zhí)行instance.sayName()
時(shí),會(huì)執(zhí)行兩次搜索,第一次搜索實(shí)例對(duì)象,第二次搜索原型對(duì)象
總結(jié)
以上就是多個(gè)實(shí)例對(duì)象共享原型所掛載的屬性和方法的基本原理!
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
簡(jiǎn)單介紹JavaScript的變量和數(shù)據(jù)類型
這篇文章主要介紹了簡(jiǎn)單介紹JavaScript的變量和數(shù)據(jù)類型,是JS入門中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-06-06window.close(); 關(guān)閉瀏覽器窗口js代碼的總結(jié)介紹
下面小編就為大家?guī)?lái)一篇window.close(); 關(guān)閉瀏覽器窗口js代碼的總結(jié)介紹。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-07-07javascript實(shí)現(xiàn)的圖片切割多塊效果實(shí)例
這篇文章主要介紹了javascript實(shí)現(xiàn)的圖片切割多塊效果,涉及javascript操作圖片及css樣式的技巧,需要的朋友可以參考下2015-05-05javascript中遞歸函數(shù)用法注意點(diǎn)
這篇文章主要針對(duì)javascript中遞歸函數(shù)用法注意點(diǎn)做介紹,有需要小伙伴可以來(lái)學(xué)習(xí)下2015-07-07