mozilla

Compare Revisions

Object.prototype.__proto__

Change Revisions

Revision 508887:

Revision 508887 by DavidWalsh on

Revision 510255:

Revision 510255 by Waldo on

Title:
Object.prototype.__proto__
Object.prototype.__proto__
Slug:
Web/JavaScript/Reference/Global_Objects/Object/proto
Web/JavaScript/Reference/Global_Objects/Object/proto
Tags:
"JavaScript", "Property", "prototype", "Object"
"JavaScript", "Property", "prototype", "Object"
Content:

Revision 508887
Revision 510255
n13    <div class="summary">n13    <div class="warning">
n15        An Object's <strong><code>__proto__</code></strong> propen15        The <code>__proto__</code> property is deprecated and sho
>rty references the same object as its internal <code>[[Prototype]>uld not be used.&nbsp; {{jsxref("Object.getPrototypeOf")}} should
>]</code> (often referred to as "the prototype"), which may be an > be used instead of the <code>__proto__</code> getter to determin
>object or, as in the default case of <code>Object.prototype.__pro>e the [[Prototype]] of an object.&nbsp; Mutating the <code>[[Prot
>to__,</code> <code>null</code>. This property is an abstraction e>otype]]</code> of an object, no matter how this is accomplished, 
>rror, because a property with the same name, but some other value>is strongly discouraged, because it is very slow and unavoidably 
>, could be defined on the object too.>slows down subsequent execution in modern JavaScript implementati
 >ons.&nbsp; However, {{jsxref("Object.setPrototypeOf")}} is provid
 >ed in ES6 as a very-slightly-preferred alternative to the <code>_
 >_proto__</code> setter.
n19      If there is a need to reference an object's prototype, the n19      The <code>__proto__</code> property of <a href="/en-US/docs
>preferred method is to use {{jsxref("Object.getPrototypeOf")}}. I>/Web/JavaScript/Reference/Global_Objects/Object/prototype"><code>
>n addition, ECMAScript 6 defines the {{jsxref("Object.setPrototyp>Object.prototype</code></a> is an accessor property (a getter fun
>eOf")}} method to set the prototype of an object.>ction and a setter function) that exposes the internal <code>[[Pr
 >ototype]]</code> (either an object or <code>null</code>) of the o
 >bject through which it is accessed.
n34      When an object is created, its <code>__proto__</code> propen34      The <code>__proto__</code> getter function exposes the valu
>rty is set to reference the same object as its internal <code>[[P>e of the internal <code>[[Prototype]]</code> of an object.&nbsp; 
>rototype]]</code> (i.e. its constructor's <code>prototype</code> >For objects created using an object literal, this value is {{jsxr
>object). Assigning a new value to <code>__proto__</code> also cha>ef("Object.prototype")}}.&nbsp; For objects created using array l
>nges the value of the internal <code>[[Prototype]]</code> propert>iterals, this value is {{jsxref("Array.prototype")}}.&nbsp; For f
>y, except where the object is non–extensible.>unctions, this value is {{jsxref("Function.prototype")}}.&nbsp; F
 >or objects created using <code>new fun</code>, where <code>fun</c
 >ode> is one of the built-in constructor functions provided by Jav
 >aScript ({{jsxref("Array")}}, {{jsxref("Boolean")}}, {{jsxref("Da
 >te")}}, {{jsxref("Number")}}, {{jsxref("Object")}}, {{jsxref("Str
 >ing")}}, and so on -- including new constructors added as JavaScr
 >ipt evolves), this value is <code>fun.prototype</code>.&nbsp; For
 > objects created using <code>new fun</code>, where <code>fun</cod
 >e> is a function defined in a script, this value is the value of 
 ><code>fun.prototype</code> at the time <code>new fun</code> is ev
 >aluated.&nbsp; (That is, if a new value is assigned to <code>fun.
 >prototype</code>, previously-created <code>fun</code> instances w
 >ill continue to have the previous value as their [[Prototype]], a
 >nd subsequent <code>new fun</code> calls will use the newly-assig
 >ned value as their <code>[[Prototype]]</code>.)
35    </p>
36    <div class="note">
37      <p>
38        The {{jsxref("Object.getPrototypeOf")}} function is the p
 >referred way to access the <code>[[Prototype]]</code> of an objec
 >t.&nbsp; <code>__proto__</code> and the <code>__proto__</code> ge
 >tter function are deprecated and should not be used.
39      </p>
40    </div>
35    </p>41    <p>
42      The __proto__ setter allows the <code>[[Prototype]]</code> 
 >of an object to be mutated.&nbsp; The object must be extensible a
 >ccording to {{jsxref("Object.isExtensible")}}: if it is not, a <c
 >ode>TypeError</code> is thrown.&nbsp; The value provided must be 
 >an object or <code>null</code>.&nbsp; Providing any other value w
 >ill do nothing.
43    </p>
44    <div class="warning">
45      <p>
46        Mutating the <code>[[Prototype]]</code> of an object is, 
 >by the nature of how modern JavaScript engines optimize property 
 >accesses, a very slow operation.&nbsp; If you care at all about p
 >erformance, you should never mutate the <code>[[Prototype]]</code
 >> of an object, either using this method or using {{jsxref("Objec
 >t.setPrototypeOf")}}.&nbsp; Instead, create the object with the d
 >esired <code>[[Prototype]]</code> using {{jsxref("Object.create")
 >}}.&nbsp; Furthermore, <code>__proto__</code> and the <code>__pro
 >to__</code> setter function are deprecated and should not be used
 >.
47      </p>
48    </div>
nn52    <p>
53      There is nothing special about the <code>__proto__</code> p
 >roperty.&nbsp; It is simply an accessor property -- a property co
 >nsisting of a getter function and a setter function -- on {{jsxre
 >f("Object.prototype")}}.&nbsp; A property access for <code>"__pro
 >to__"</code> that eventually consults {{jsxref("Object.prototype"
 >)}} will find this property, but an access that does not consult 
 >{{jsxref("Object.prototype")}} will not find it.&nbsp; If some ot
 >her <code>"__proto__"</code> property is found before {{jsxref("O
 >bject.prototype")}} is consulted, that property will hide the one
 > found on {{jsxref("Object.prototype")}}.
54    </p>
55    <pre class="brush: js">
56var noProto = Object.create(null);
57 
58print("noProto.__proto__: " + typeof noProto.__proto__); // noPro
 >to.__proto__: undefined
59print("noProto.[[Prototype]]: " + Object.getPrototypeOf(noProto))
 >; // noProto.[[Prototype]]: null
60 
61noProto.__proto__ = 17;
62 
63print("noProto.__proto__: " + noProto.__proto__); // noProto.__pr
 >oto__: 17
64print("noProto.[[Prototype]]: " + Object.getPrototypeOf(noProto))
 >; // noProto.[[Prototype]]: null
65 
66var protoHidden = {};
67Object.defineProperty(protoHidden, "__proto__",
68                      { value: 42, writable: true, configurable: 
 >true, enumerable: true });
69 
70print("protoHidden.__proto__: " + protoHidden.__proto__); // prot
 >oHidden.__proto__: 42
71print("protoHidden.[[Prototype]] is Object.prototype: " +
72      Object.getPrototypeOf(protoHidden) === Object.prototype); /
 >/ protoHidden.[[Prototype]] is Object.prototype: true
73</pre>
t116            Included in the (normative) annex for addtional ECMASt151            Included in the (normative) annex for addtional ECMAS
>cript features for Web browsers (note that the specification codi>cript features for Web browsers (note that the specification codi
>fies what is already in implementations and what websites may cur>fies what is already in implementations).
>rently rely on). 

Back to History