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

JavaScript原型與實(shí)例詳解

 更新時(shí)間:2021年12月26日 16:30:38   作者:程序員云錦  
這篇文章主要為大家介紹了JavaScript原型與實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

構(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)文章

最新評(píng)論