日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

詳解js中的原型,原型對象,原型鏈

瀏覽:223日期:2024-05-26 10:43:55

理解原型

我們創建的每一個函數都有一個prototype(原型)屬性,這個屬性是一個指針,指向一個對象,而這個對象的用途是包含可以由特定類型的所有實例共享的屬性和方法??慈缦吕樱?/p>

function Person(){}Person.prototype.name = ’ccc’Person.prototype.age = 18Person.prototype.sayName = function (){ console.log(this.name);}var person1 = new Person()person1.sayName() // --> cccvar person2 = new Person()person2.sayName() // --> cccconsole.log(person1.sayName === person2.sayName) // --> true

理解原型對象

根據上面代碼,看下圖:

詳解js中的原型,原型對象,原型鏈

需要理解三點:

我們只要創建了一個新的函數,就會根據一組特定的規則為該函數創建一個prototype屬性,指向函數的原型對象。即Person(構造函數)有一個prototype指針,指向Person.prototype 默認情況下,每個原型對象上都會創建一個constructor(構造函數)屬性,這個屬性是一個指向prototype屬性所在函數的指針 每個實例的內部都有一個指針(內部屬性) ,指向構造函數的原型對象。即 person1 和person2 身上都有一個內部屬性__proto__(在ECMAscript中管這個指針叫[[prototype]],雖然在腳本中沒有標準的方式訪問[[prototype]],但是firefox,ie,chrome都支持一個屬性叫__proto__) 指向Person.prototype

注意:person1 和person2 實例與構造函數之間沒有直接的關系。

在之前我們提到,所有實現中無法訪問到[[prototype]],那我們如何知道實例和原型對象之間是否存在關系呢?這里可以通過兩個方法來判斷:

原型對線上的方法:isPrototypeOf(),如:console.log(Person.prototype.isPrototypeOf(person1)) // --> true ECMAscript5中新增的一個方法:Object.getPrototypeOf(),這個方法返回[[prototype]]的值。如:console.log(Object.getPrototypeOf(person1) === Person.prototype) // --> true

實例屬性與原型屬性的關系

前面我們提到過,原型最初只包含constructor屬性,而該屬性也是共享的,因此可以通過對象實例訪問。雖然可以通過對象實例訪問保存在原型中的值,但卻不能通過對象實例重寫原型中的值。如果我們在實例中添加了一個屬性,而改屬性與實例原型中的一個屬性同名,那就會在實例上創建該屬性并屏蔽原型中的那個屬性。如下:

function Person() {}Person.prototype.name = 'ccc';Person.prototype.age = 18;Person.prototype.sayName = function() { console.log(this.name);};var person1 = new Person();var person2 = new Person();person1.name = ’www’ // 在person1中添加一個name屬性person1.sayName() // --> ’www’————’來自實例’person2.sayName() // --> ’ccc’————’來自原型’console.log(person1.hasOwnProperty(’name’)) // --> trueconsole.log(person2.hasOwnProperty(’name’)) // --> falsedelete person1.name // --> 刪除person1中新添加的name屬性person1.sayName() // -->’ccc’————’來自原型’

我們如何判斷一個屬性,到底是實例上的屬性還是原型上的屬性?這里可以通過hasOwnProperty()方法來檢測一個屬性是存在于實例中還是存在于原型中。(此方法繼承于Object)

下圖詳細分析了上面例子在不同情況下的實現與原型的關系:(省略了Person構造函數的的關系)

詳解js中的原型,原型對象,原型鏈

更簡單的原型語法

我們不可能總像之前的例子一樣,沒添加一個屬性和方法就要敲一遍,Person.prototype。為了減少不必要的輸入,更常見的方法是像下面這樣:

function Person(){}Person.prototype ={ name: ’ccc’, age: 18, sayName: function () { console.log(this.name) }}

在上面代碼中,我們將Person.prototype設置為等于一個以對象字面量形式創建的新對象。最終結果相同,但有一個例外,constructor屬性不再指向Person了。前面我們介紹過,每創建一個函數,就會同時創建它的prototype對象,這個對象也會自動獲得constructor屬性。但是在我們使用的新語法中,本質上完全重寫了默認的prototype對象,因此constructor屬性也就變成了新對象的constructor屬性(指向Object構造函數),不再指向Person函數了。此時,盡管instanceof操作符還能返回正確的結果,但通過constructor已經無法確定對象的類型了。如下:

var person1 = new Person()console.log(person1 instanceof Object) // --> trueconsole.log(person1 instanceof Person) // --> trueconsole.log(person1.constructor === Person) // --> falseconsole.log(person1.constructor === Object) // --> true

這里用instanceof操作符測試Object和Person仍然返回true,constructor屬性則等于Object,不等于Person了,如果constructor真的很重要可以像下面這樣寫:

function Person(){}Person.prototype ={ constructor: Person, // --> 重設 name: ’ccc’, age: 18, sayName: function () { console.log(this.name) }}

但是這會引起一個新問題,用上述方式重置constructor屬性會導致它的[[Enumerable]]特性被設置為true。而默認情況下,原生的constructor屬性是不可枚舉的。因此如果你要使用兼容ECMAscript5的JavaScript引擎,可以試一試Object.defineProperty()。

function Person(){}Person.constructor = { name: ’ccc’, age: 18, sayName: function(){ console.log(this.name) }}// 重設構造函數,只適用于ECMAscript5兼容的瀏覽器Object.defineProperty(Person.constructor, 'constructor', { enumerable: false, value: Person})

原型的動態性

由于原型中查找值的過程是一次搜索,因此我們對原型對象所做的任何修改都能立即從實例上反映出來。比如:

function Person(){}var person1 = new Person()Person.prototype.sayHi= function(){ console.log(’hi’)}person1.sayHi()

上述代碼我們先創建了一個Person實例,并將其保存在person1中,然后在Person.prototype中添加了sayHi()方法。即使person1是添加新方法之前創建的,但它仍然可以訪問這個方法。原因是實例與原型之間的松散的連接關系。盡管可以隨時為原型添加屬性和方法,并立即能夠在實例中反映出來。但是如果重寫整個原型對象,那么情況就不一樣了??慈缦麓a:

function Person(){}var person1 = new Person()Person.prototype = { name: ’ccc’, age: 18, sayName: function(){ console.log(this.name) }}person1.sayName() // --> error

看下圖分析:

詳解js中的原型,原型對象,原型鏈

調用構造函數時為實例添加了一個指向最初原型的[[prototype]]指針,而把原型修改為另外一個對線更久等于切斷了構造函數與最初原型之間的聯系。請記住:實例中的指針僅指向原型,而不指向構造函數。

原型鏈

簡單的回顧一下構造函數、原型和實例的關系:每個構造函數都有一個原型對象,原型對象都包含一個指向構造函數的指針,而實例都包含一個指向原型對象的內部指針。那么假如我們讓原型對象等于另一個類型的實例,結果會怎樣?顯然,此時的原型對象將包含一個指向另一個原型的指針,相應地,另一個原型中也包含著一個指向另一個構造函數的指針。假如另一個原型又是另一個類型的實例,那么上述關系依然成立。如此層層遞進,就構成了實例與原型的鏈條。這就是所謂的原型鏈的基本概念。

詳解js中的原型,原型對象,原型鏈

圖中由相互關聯的原型組成的鏈狀結構就是原型鏈,也就是藍色的這條線。

以上就是詳解js中的原型,原型對象,原型鏈的詳細內容,更多關于js中的原型,原型對象,原型鏈的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
色婷婷色综合| 国产欧美日韩一区二区三区四区 | 久久久久久久久久久9不雅视频| 日韩精品一区二区三区中文在线 | 亚洲欧洲日韩精品在线| 国产精品毛片| 亚洲欧美日韩国产一区二区| 午夜在线一区| 蜜桃91丨九色丨蝌蚪91桃色| 蜜桃视频在线观看一区二区| 日韩国产在线观看| 国产精品jk白丝蜜臀av小说| 精品美女在线视频| 久久夜夜操妹子| 激情自拍一区| 日韩一区二区三区四区五区| 欧美日韩夜夜| 精精国产xxxx视频在线野外| 婷婷综合网站| 日韩高清在线观看一区二区| 国产精品啊啊啊| 电影天堂国产精品| 日本亚洲三级在线| 日韩av成人高清| 91亚洲国产高清| 亚洲精品一区二区在线看| 亚洲一二三区视频| 日韩av在线免费观看不卡| 国产精品日本一区二区不卡视频 | 91精品精品| av亚洲免费| 日本h片久久| 麻豆成人综合网| av不卡在线| 久久久久久色 | 99成人在线| 欧美自拍一区| 成人午夜精品| 日韩精选在线| 免费不卡中文字幕在线| 国产日韩中文在线中文字幕 | 欧美一区成人| 91精品啪在线观看国产18| 日韩中文字幕| 午夜影院欧美| 精品国内亚洲2022精品成人 | 久久久久久久久久久9不雅视频| 视频一区中文字幕精品| 亚洲调教视频在线观看| 国产伦精品一区二区三区视频| 欧美1区2区3区| 成人国产精品一区二区免费麻豆| 日本亚洲最大的色成网站www| 国产成人免费| 88久久精品| 亚洲ab电影| 中文无码日韩欧| 欧美中文字幕| 好看的av在线不卡观看| 亚洲精品乱码| 另类亚洲自拍| 久久高清国产| 亚洲欧美日韩在线观看a三区| 国产亚洲一区在线| 一本综合精品| 欧美日韩网址| 久久av影视| 九九九精品视频| 国内不卡的一区二区三区中文字幕| 国产高清亚洲| 国产一区三区在线播放| 欧美三级网址| 快she精品国产999| 欧美一级网站| 六月天综合网| 亚州av一区| 奇米狠狠一区二区三区| 日本欧美一区二区在线观看| 欧美日韩国产免费观看视频| 久久天堂精品| 男女性色大片免费观看一区二区| 婷婷综合五月| 久久久久久久久久久9不雅视频| 日本在线一区二区三区| 三级欧美韩日大片在线看| 快播电影网址老女人久久| 深夜福利一区| 欧美精选视频一区二区| 日本中文字幕不卡| 免播放器亚洲| 国产精品sss在线观看av| 国产手机视频一区二区| 不卡一二三区| 成人国产综合| 精品一区视频| 国产在线观看91一区二区三区| 国产aⅴ精品一区二区三区久久 | 精品三级在线观看视频| 国产一区二区三区网| 一区二区精品| 男人操女人的视频在线观看欧美| 国产一区二区三区精品在线观看| 亚洲精品麻豆| 伊人久久一区| 国产精品丝袜在线播放| 里番精品3d一二三区| 国产一区二区三区久久| 天堂√8在线中文| 日韩一区二区久久| 欧美国产不卡| 欧美激情aⅴ一区二区三区| 国产精品极品国产中出| 国产精品密蕾丝视频下载| 国产另类在线| 日韩欧美精品一区| 久久av一区| 久久av国产紧身裤| 日韩在线a电影| 国产a亚洲精品| 亚洲免费毛片| 亚洲精品系列| 国产一区久久| 国产一区二区视频在线看| 亚洲黄色免费av| 亚洲婷婷丁香| 国产精品一页| 美女一区网站| 97久久超碰| 国产亚洲在线观看| 精品视频高潮| 中文字幕亚洲在线观看| 亚洲三级国产| 神马午夜在线视频| 日韩中文字幕av电影| 免费在线亚洲| 男女男精品网站| 女同性一区二区三区人了人一 | 精品伊人久久久| 久久不射中文字幕| 国产理论在线| 亚洲精品系列| 日本高清不卡一区二区三区视频| 国产精品夜夜夜| 日韩精品久久久久久久软件91| 91精品高清| 亚洲综合精品四区| 亚洲精品少妇| 亚洲欧美日韩国产| 尹人成人综合网| 精品视频在线观看网站| 国产欧美在线观看免费| 日韩不卡在线观看日韩不卡视频| 亚洲精品网址| 美女久久网站| 美女久久一区| 国产精品一区二区三区av| 日本亚洲最大的色成网站www | 国产精品久久乐| 亚洲日本久久| 亚洲一区久久| 免费日韩av| 一区二区三区四区精品视频| 久久香蕉精品| 欧美一区二区三区久久精品| 三级欧美在线一区| 91成人精品| 欧美久久久网站| 亚洲精品在线a| 欧美私人啪啪vps| 国产日韩免费| 国产超碰精品| 日韩激情综合| 久久久精品午夜少妇| 天堂久久一区| 欧美国产91| 欧美香蕉视频| 尤物精品在线| 亚洲激情欧美| 久久国产成人午夜av影院宅| 亚欧洲精品视频在线观看| 99国产精品久久久久久久成人热| 精品国产18久久久久久二百| 国产精品玖玖玖在线资源| 久久福利一区| 国产精品丝袜在线播放| 午夜av成人| 欧美日韩1区| 午夜久久一区| 亚洲91在线| 精品久久97| 久久久久国产| 精品1区2区3区4区| 免费视频一区二区三区在线观看| 亚洲免费影视| 日本色综合中文字幕| 精品精品国产三级a∨在线| 里番精品3d一二三区| 亚洲四虎影院| 免费国产自线拍一欧美视频| 精品国产成人|