摘要:屬性對性能影響非常嚴重,不建議使用。當你創建函數時,會為這個函數自動添加屬性。構造函數原型的默認指向自身。所有對象均從繼承屬性。結果見下圖普通對象是構造函數的實例,所以普通對象的原型是。總結和其它函數由產生,的是他自己。
_proto_
每個對象都有一個__proto__(前后各兩個下劃線)屬性來標識自己所繼承的原型對象。__proto__屬性對性能影響非常嚴重,不建議使用。
prototype只有函數才有prototype屬性。當你創建函數時,JS會為這個函數自動添加prototype屬性。構造函數原型的constructor默認指向自身。
function Person(){ this.name="aaa"; } Person===Person.prototype.constructor // true console.log(Person.prototype);// 結果見下圖Object和Function
每個內置對象都是一個native object。一個內置的對象同時也是一個構造函數。function是一種對象類型。
Function
function是內置Function的實例,即普通函數是Function的實例。因此普通函數的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
函數都有prototype屬性和__proto__ 屬性。函數的__proto__ 屬性均是function () { [native code] }。可以這樣理解,function既是對象,又是函數。function作為對象,有__proto__ 屬性,因為__proto__ 屬性指向構造函數的原型,而function是由Function創建的,因此普通函數.__proto__ =Function.prototype。
function Person(){var a=1;} Person.__proto__===Function.prototype ///true Function.prototype //function () { [native code] }
Function.prototype和Function.__proto__為同一對象。這是由于構造Function的是他自己,根據普通函數.__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也是一個原型對象,而普通對象的原型是Object.prototype,所以
Function.prototype.__proto__===Object.prototype //true
注意:使用 Function.prototype.bind創造的函數,沒有prototype屬性。
Object
Object.__proto__是Function.prototype。因為Object本身是個(構造)函數,是Function的實例。
Object.__proto__ //function () { [native code] } Object.constructor //function Function() { [native code] }
原型鏈的盡頭(root)是Object.prototype。所有對象均從Object.prototype繼承屬性。
Object.prototype.__proto__ // null
某個對象.__proto__ =構造函數.prototype 。
var a={}; a.__proto__===Object.prototype //true a.__proto__ //結果見下圖
普通對象是Object構造函數的實例,所以普通對象的原型是Object.prototype。
function Person(){this.name="aa";} var b=new Person(); b.__proto__===Person.prototype; //true b.__proto__ //結果見下圖
上圖中b對象是Person構造函數的實例,所以b對象的原型是Person.prototype。
總結1. Object和其它函數由Function產生,Function的constructor是他自己。
2. 一個對象必定有__proto__,而原型鏈的頂端是Object.prototype。
3. Object.prototype 是對象,但是不是通過Object函數創建的。因為Object.prototype.__proto__為null。
4. Object的__proto__是Function.prototype,但是Function.prototype也是一個原型對象,因此Function.prototype.__proto__為Object.prototype。
參考自:
從__proto__和prototype來深入理解JS對象和原型鏈
Function
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/82909.html
摘要:今天同事小英童鞋問了我一個問題小英童鞋認為的原型對象是,所以會繼承的屬性,調用相當于調用,但結果不是一個方法。構造函數創建對象實例函數有兩個不同的內部方法和。如果不通過關鍵字調用函數,則執行函數,從而直接執行代碼中的函數體。 今天同事小英童鞋問了我一個問題: function Foo(firstName, lastName){ this.firstName = firstNam...
摘要:寫在前面如果說是一本武學典籍,那么原型鏈就是九陽神功。那么,如何修煉好中的九陽神功呢真正的功法大成的技術是從底層上去理解,那種工程師和碼農的區別就在于對底層的理解,當你寫完一行代碼,或者你遇見一個解決的速度取決于你對底層的理解。 寫在前面 如果說JavaScript是一本武學典籍,那么原型鏈就是九陽神功。在金庸的武俠小說里面,對九陽神功是這樣描述的:練成「九陽神功」后,會易筋洗髓;生出...
摘要:寫在前面如果說是一本武學典籍,那么原型鏈就是九陽神功。那么,如何修煉好中的九陽神功呢真正的功法大成的技術是從底層上去理解,那種工程師和碼農的區別就在于對底層的理解,當你寫完一行代碼,或者你遇見一個解決的速度取決于你對底層的理解。 寫在前面 如果說JavaScript是一本武學典籍,那么原型鏈就是九陽神功。在金庸的武俠小說里面,對九陽神功是這樣描述的:練成「九陽神功」后,會易筋洗髓;生出...
摘要:寫在前面如果說是一本武學典籍,那么原型鏈就是九陽神功。那么,如何修煉好中的九陽神功呢真正的功法大成的技術是從底層上去理解,那種工程師和碼農的區別就在于對底層的理解,當你寫完一行代碼,或者你遇見一個解決的速度取決于你對底層的理解。 寫在前面 如果說JavaScript是一本武學典籍,那么原型鏈就是九陽神功。在金庸的武俠小說里面,對九陽神功是這樣描述的:練成「九陽神功」后,會易筋洗髓;生出...
閱讀 2593·2023-04-25 20:50
閱讀 3946·2023-04-25 18:45
閱讀 2220·2021-11-17 17:00
閱讀 3330·2021-10-08 10:05
閱讀 3080·2019-08-30 15:55
閱讀 3495·2019-08-30 15:44
閱讀 2360·2019-08-29 13:51
閱讀 1118·2019-08-29 12:47