摘要:屬性對(duì)性能影響非常嚴(yán)重,不建議使用。當(dāng)你創(chuàng)建函數(shù)時(shí),會(huì)為這個(gè)函數(shù)自動(dòng)添加屬性。構(gòu)造函數(shù)原型的默認(rèn)指向自身。所有對(duì)象均從繼承屬性。結(jié)果見下圖普通對(duì)象是構(gòu)造函數(shù)的實(shí)例,所以普通對(duì)象的原型是。總結(jié)和其它函數(shù)由產(chǎn)生,的是他自己。
_proto_
每個(gè)對(duì)象都有一個(gè)__proto__(前后各兩個(gè)下劃線)屬性來標(biāo)識(shí)自己所繼承的原型對(duì)象。__proto__屬性對(duì)性能影響非常嚴(yán)重,不建議使用。
prototype只有函數(shù)才有prototype屬性。當(dāng)你創(chuàng)建函數(shù)時(shí),JS會(huì)為這個(gè)函數(shù)自動(dòng)添加prototype屬性。構(gòu)造函數(shù)原型的constructor默認(rèn)指向自身。
function Person(){ this.name="aaa"; } Person===Person.prototype.constructor // true console.log(Person.prototype);// 結(jié)果見下圖Object和Function
每個(gè)內(nèi)置對(duì)象都是一個(gè)native object。一個(gè)內(nèi)置的對(duì)象同時(shí)也是一個(gè)構(gòu)造函數(shù)。function是一種對(duì)象類型。
Function
function是內(nèi)置Function的實(shí)例,即普通函數(shù)是Function的實(shí)例。因此普通函數(shù)的constructor是Function。Function的constructor還是他自己。
function Person(){var a=1;} Person.constructor //function Function() { [native code] } Function //function Function() { [native code] } Function.constructor //function Function() { [native code] } Function===Function.constructor //true
函數(shù)都有prototype屬性和__proto__ 屬性。函數(shù)的__proto__ 屬性均是function () { [native code] }??梢赃@樣理解,function既是對(duì)象,又是函數(shù)。function作為對(duì)象,有__proto__ 屬性,因?yàn)開_proto__ 屬性指向構(gòu)造函數(shù)的原型,而function是由Function創(chuàng)建的,因此普通函數(shù).__proto__ =Function.prototype。
function Person(){var a=1;} Person.__proto__===Function.prototype ///true Function.prototype //function () { [native code] }
Function.prototype和Function.__proto__為同一對(duì)象。這是由于構(gòu)造Function的是他自己,根據(jù)普通函數(shù).__proto__ =Function.prototype,所以Function.__proto__ =Function.prototype。
Function.prototype //function () { [native code] } Function.__proto__ // function () { [native code] } Function.prototype===Function.__proto__ //true
Function.prototype的__proto__是Object.prototype。可以這樣理解:Function.prototype也是一個(gè)原型對(duì)象,而普通對(duì)象的原型是Object.prototype,所以
Function.prototype.__proto__===Object.prototype //true
注意:使用 Function.prototype.bind創(chuàng)造的函數(shù),沒有prototype屬性。
Object
Object.__proto__是Function.prototype。因?yàn)镺bject本身是個(gè)(構(gòu)造)函數(shù),是Function的實(shí)例。
Object.__proto__ //function () { [native code] } Object.constructor //function Function() { [native code] }
原型鏈的盡頭(root)是Object.prototype。所有對(duì)象均從Object.prototype繼承屬性。
Object.prototype.__proto__ // null
某個(gè)對(duì)象.__proto__ =構(gòu)造函數(shù).prototype 。
var a={}; a.__proto__===Object.prototype //true a.__proto__ //結(jié)果見下圖
普通對(duì)象是Object構(gòu)造函數(shù)的實(shí)例,所以普通對(duì)象的原型是Object.prototype。
function Person(){this.name="aa";} var b=new Person(); b.__proto__===Person.prototype; //true b.__proto__ //結(jié)果見下圖
上圖中b對(duì)象是Person構(gòu)造函數(shù)的實(shí)例,所以b對(duì)象的原型是Person.prototype。
總結(jié)1. Object和其它函數(shù)由Function產(chǎn)生,F(xiàn)unction的constructor是他自己。
2. 一個(gè)對(duì)象必定有__proto__,而原型鏈的頂端是Object.prototype。
3. Object.prototype 是對(duì)象,但是不是通過Object函數(shù)創(chuàng)建的。因?yàn)镺bject.prototype.__proto__為null。
4. Object的__proto__是Function.prototype,但是Function.prototype也是一個(gè)原型對(duì)象,因此Function.prototype.__proto__為Object.prototype。
參考自:
從__proto__和prototype來深入理解JS對(duì)象和原型鏈
Function
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/82909.html
摘要:今天同事小英童鞋問了我一個(gè)問題小英童鞋認(rèn)為的原型對(duì)象是,所以會(huì)繼承的屬性,調(diào)用相當(dāng)于調(diào)用,但結(jié)果不是一個(gè)方法。構(gòu)造函數(shù)創(chuàng)建對(duì)象實(shí)例函數(shù)有兩個(gè)不同的內(nèi)部方法和。如果不通過關(guān)鍵字調(diào)用函數(shù),則執(zhí)行函數(shù),從而直接執(zhí)行代碼中的函數(shù)體。 今天同事小英童鞋問了我一個(gè)問題: function Foo(firstName, lastName){ this.firstName = firstNam...
摘要:寫在前面如果說是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。那么,如何修煉好中的九陽(yáng)神功呢真正的功法大成的技術(shù)是從底層上去理解,那種工程師和碼農(nóng)的區(qū)別就在于對(duì)底層的理解,當(dāng)你寫完一行代碼,或者你遇見一個(gè)解決的速度取決于你對(duì)底層的理解。 寫在前面 如果說JavaScript是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。在金庸的武俠小說里面,對(duì)九陽(yáng)神功是這樣描述的:練成「九陽(yáng)神功」后,會(huì)易筋洗髓;生出...
摘要:寫在前面如果說是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。那么,如何修煉好中的九陽(yáng)神功呢真正的功法大成的技術(shù)是從底層上去理解,那種工程師和碼農(nóng)的區(qū)別就在于對(duì)底層的理解,當(dāng)你寫完一行代碼,或者你遇見一個(gè)解決的速度取決于你對(duì)底層的理解。 寫在前面 如果說JavaScript是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。在金庸的武俠小說里面,對(duì)九陽(yáng)神功是這樣描述的:練成「九陽(yáng)神功」后,會(huì)易筋洗髓;生出...
摘要:寫在前面如果說是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。那么,如何修煉好中的九陽(yáng)神功呢真正的功法大成的技術(shù)是從底層上去理解,那種工程師和碼農(nóng)的區(qū)別就在于對(duì)底層的理解,當(dāng)你寫完一行代碼,或者你遇見一個(gè)解決的速度取決于你對(duì)底層的理解。 寫在前面 如果說JavaScript是一本武學(xué)典籍,那么原型鏈就是九陽(yáng)神功。在金庸的武俠小說里面,對(duì)九陽(yáng)神功是這樣描述的:練成「九陽(yáng)神功」后,會(huì)易筋洗髓;生出...
閱讀 2598·2023-04-25 20:50
閱讀 3961·2023-04-25 18:45
閱讀 2231·2021-11-17 17:00
閱讀 3337·2021-10-08 10:05
閱讀 3086·2019-08-30 15:55
閱讀 3503·2019-08-30 15:44
閱讀 2365·2019-08-29 13:51
閱讀 1121·2019-08-29 12:47