摘要:和的關(guān)系先上答案對象上都有屬性函數(shù)也是對象一般情況下對象的屬性指向該對象的構(gòu)造函數(shù)的原型對象。兩者的關(guān)系先上一張神圖每個被構(gòu)造函數(shù)創(chuàng)建出來的對象都有一個隱式引用,指向其構(gòu)造函數(shù)的屬性的值。
__proto__ 和 prototype的關(guān)系
? 對象上都有__proto__屬性(函數(shù)也是對象)
? 一般情況下對象的__proto__屬性指向該對象的構(gòu)造函數(shù)的原型對象。
? 函數(shù)上才有prototype屬性,該屬性指向該函數(shù)的原型對象。
OK,下面來詳細(xì)解釋一下
什么是__proto__這個其實是一個 internal slot (翻譯成內(nèi)置槽?),叫做 [[ prototype ]] ,也稱為隱式原型。在js里所有的普通對象都會有。它的值要么是 null(原型鏈的最終), 要么還是一個對象。
之前并沒有一個標(biāo)準(zhǔn)的方法來訪問這個值,但是大多數(shù)瀏覽器都支持通過用.__proto__來得到它的值。所以 [[ prototype ]] 就被叫成了 __proto__ 。直到ES5中增加了標(biāo)準(zhǔn)的方法 :Object.getPrototypeOf()
All ordinary objects have an internal slot called [[Prototype]]. The value of this internal slot is either null or an object and is used for implementing inheritance.什么是prototypeECMAScript Language Specification
所有用 function 語句、函數(shù)字面量或者 Function 構(gòu)造函數(shù)定義的函數(shù)都會同時自動創(chuàng)建一個 prototype 屬性,指向該函數(shù)的原型對象。
另外,通過Function.prototype.bind()創(chuàng)建的函數(shù)沒有 prototype 屬性。
NOTE 1 Function objects created using Function.prototype.bind are exotic objects. They also do not have a prototype property.ECMAScript Language Specification
這里 Function 的 prototype 有點不同,實際上它是內(nèi)部對象%FunctionPrototype%,它本身是一個內(nèi)置函數(shù)對象。
它有一些特殊的規(guī)則,比如 Function.prototype.length === 0 等
The Function prototype object is the intrinsic object %FunctionPrototype%. The Function prototype object is itself a built-in function object. When invoked, it accepts any arguments and returns undefined. It does not have a [[Construct]] internal method so it is not a constructor.NOTEThe Function prototype object is specified to be a function object to ensure compatibility with ECMAScript code that was created prior to the ECMAScript 2015 specification.
The value of the [[Prototype]] internal slot of the Function prototype object is the intrinsic object %ObjectPrototype% (19.1.3). The initial value of the [[Extensible]] internal slot of the Function prototype object is true.
The Function prototype object does not have a prototype property.
The value of the length property of the Function prototype object is 0.
The value of the name property of the Function prototype object is the empty String.
ECMAScript Language Specification
Object 的 prototype 也有一點不一樣,它其實是內(nèi)部對象%ObjectPrototype%,它本身是一個普通對象。
做為對象它的 __proto__ 也就是 [[prototype]] 值為 null 。
Object.prototype上掛載著valueOf,toString等方法。
The Object prototype object is the intrinsic object %ObjectPrototype%. The Object prototype object is an ordinary object.兩者的關(guān)系The value of the [[Prototype]] internal slot of the Object prototype object is null and the initial value of the [[Extensible]] internal slot is true.
ECMAScript Language Specification
先上一張神圖 :
每個被構(gòu)造函數(shù)創(chuàng)建出來的對象都有一個隱式引用,指向其構(gòu)造函數(shù)的prototype屬性的值。此外,一個原型可能對它的原型有一個非空的隱式引用,以此類推,就叫做原型鏈。
Every object created by a constructor has an implicit reference (called the object’s prototype) to the value of its constructor’s "prototype" property. Furthermore, a prototype may have a non-null implicit reference to its prototype, and so on; this is called the prototype chain. When a reference is made to a property in an object, that reference is to the property of that name in the first object in the prototype chain that contains a property of that name. In other words, first the object mentioned directly is examined for such a property; if that object contains the named property, that is the property to which the reference refers; if that object does not contain the named property, the prototype for that object is examined next; and so on.ECMAScript Language Specification
看圖說話
構(gòu)造函數(shù) Foo 的原型屬性 prototype 指向了原型對象 Foo.prototype 。f1, f2 是Foo的實例,通過指向原型對象的__proto__ 就可以繼承原型對象上公有的方法。同時,F(xiàn)oo.prototype 上constructor 屬性指回 構(gòu)造函數(shù) Foo。
構(gòu)造函數(shù)Foo本身也是對象,所以也有 __proto__ ,指向了Foo的構(gòu)造函數(shù)的原型對象,也就是Function.prototype。
原型對象也是對象,所以也有 __proto__ ,指向Object.prototype。最終Object.prototype.__proto__指向 null。
(完) :)
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/101447.html
摘要:由于一般所有的原型鏈最終都會指向頂端的,所以它們都是的。好了現(xiàn)在了,成了所有對象原型鏈的。 JavaScript里任何東西都是對象,任何一個對象內(nèi)部都有另一個對象叫__proto__,即原型,它可以包含任何東西讓對象繼承。當(dāng)然__proto__本身也是一個對象,它自己也有自己的__proto__,這樣一級一級向上,就構(gòu)成了一個__proto__鏈,即原型鏈。當(dāng)然原型鏈不會無限向上,它有...
摘要:了解中原型以及原型鏈只需要記住以下點即可對象都有屬性,指向構(gòu)造函數(shù)的構(gòu)造函數(shù)函數(shù)都有屬性,指向構(gòu)造函數(shù)的原型對象的內(nèi)置構(gòu)造函數(shù)可知所有的構(gòu)造函數(shù)都繼承于甚至包括根構(gòu)造器及自身。 了解JavaScript中原型以及原型鏈只需要記住以下2點即可 對象都有__proto__屬性,指向構(gòu)造函數(shù)的prototype 構(gòu)造函數(shù)函數(shù)都有prototype屬性,指向構(gòu)造函數(shù)的原型 1、對象的__p...
摘要:的隱式原型是母,母是由構(gòu)造函數(shù)構(gòu)造的,但函數(shù)的隱式原型又是。。。。可能是考慮到它也是由構(gòu)造函數(shù)生成的吧,所以返回的值也是。 showImg(https://segmentfault.com/img/bVyLk0); 首先,我們暫且把object類型和function類型分開來,因為 function是一個特殊的對象類型,我們這里這是便于區(qū)分,把function類型單獨拿出來。順便一提,...
摘要:可以通過上述路線圖來觀察。注意到也是一個對象,所以也有屬性,這樣就構(gòu)成了一個原型鏈,最高到達(dá)為止。對于函數(shù)而言,它的指向。而這個原型對象本身不等于而是它的屬性等于當(dāng)我們手動改變一個對象的原型時即改變指向,注意。 showImg(https://segmentfault.com/img/remote/1460000011001563); 可以通過上述路線圖來觀察。 函數(shù)和對象,都有一個...
摘要:寫在前面如果說是一本武學(xué)典籍,那么原型鏈就是九陽神功。那么,如何修煉好中的九陽神功呢真正的功法大成的技術(shù)是從底層上去理解,那種工程師和碼農(nóng)的區(qū)別就在于對底層的理解,當(dāng)你寫完一行代碼,或者你遇見一個解決的速度取決于你對底層的理解。 寫在前面 如果說JavaScript是一本武學(xué)典籍,那么原型鏈就是九陽神功。在金庸的武俠小說里面,對九陽神功是這樣描述的:練成「九陽神功」后,會易筋洗髓;生出...
閱讀 2067·2019-08-30 15:53
閱讀 3064·2019-08-30 15:44
閱讀 2914·2019-08-30 14:11
閱讀 2910·2019-08-30 14:01
閱讀 2694·2019-08-29 15:16
閱讀 3719·2019-08-29 13:10
閱讀 1239·2019-08-29 10:56
閱讀 2526·2019-08-26 13:58