This translation is incomplete. Please help translate this article from English.

Warning: Schimband [[Prototype]]-ul unui obiect, dupa cum interpretoarele moderne de Javascript optimizeaza accesul proprietatilor, o operatie cu timp mare de executie, in orice browser si interpretor de JavaScript. The effects on performance of altering inheritance are subtle and far-flung, and are not limited to simply the time spent in obj.__proto__ = ... statement, but may extend to any code that has access to any object whose [[Prototype]] has been altered. If you care about performance you should avoid setting the [[Prototype]] of an object. Instead, create a new object with the desired [[Prototype]] using Object.create().

Warning: In timp ce Object.prototype.__proto__ este accesibil in orice browser, existenta sa si comportamentul exact au fost standardizate in specificatiile din ECMAScript 2015 ca o imbunatatire ce va asigura compatibilitatea browserelor web. Pentru un suport mai bun, este recomandat ca doar Object.getPrototypeOf() sa fie folosit.

Proprietatea __proto__ din Object.prototype este una de acces (o functie de get si una de set) care expune[[Prototype]] -ul intern (un obiect sau null) al obiectului din care e accesat.

Folosirea __proto__ este controversala, si chiar a fost descurajata. Initial nu a fost inclusa in specificatiile EcmaScript, dar browserele moderne au decis sa-l implementeze oricum. Doar recent, proprietatea __proto__ a fost standardizata in specificatiile ECMAScript 2015 pentru browsere web pentru pura compatibilitate,asa ca fi si in viitor. Este totusi deprecated in favoarea  Object.getPrototypeOf/Reflect.getPrototypeOf si Object.setPrototypeOf/Reflect.setPrototypeOf (totusi inca setand [[Prototype]] unui obiect este o operatie inceata care ar trebui evitata daca se pune accent pe performanta.

Proprietatea de __proto__ poate fi folosita in definitia litareala a unui obiect, pentru a sera obiectul [[Prototype]] la creare, ca o alternativa la  Object.create(). Vezi: object initializer / literal syntax.

Syntax

var Circle = function () {};
var shape = {};
var circle = new Circle();

// Set the object prototype.
// DEPRECATED. This is for example purposes only. DO NOT DO THIS in real code.
shape.__proto__ = circle;

// Get the object prototype
console.log(shape.__proto__ === circle); // true
var shape = function () {};
var p = {
    a: function () {
        console.log('aaa');
    }
};
shape.prototype.__proto__ = p;

var circle = new shape();
circle.a(); // aaa
console.log(shape.prototype === circle.__proto__); // true

// or
var shape = function () {};
var p = {
    a: function () {
        console.log('a');
    }
};

var circle = new shape();
circle.__proto__ = p;
circle.a(); // a
console.log(shape.prototype === circle.__proto__); // false

// or
function test() {};
test.prototype.myname = function () {
    console.log('myname');
};

var a = new test();
console.log(a.__proto__ === test.prototype); // true
a.myname(); // myname


// or
var fn = function () {};
fn.prototype.myname = function () {
    console.log('myname');
};

var obj = {
    __proto__: fn.prototype
};

obj.myname(); // myname

Nota: sunt 2  underscores, urmate de 5 caractere"proto", care sunt urmate de alte 2 underscores.

Descriere

Functia getter__proto__ expune valoarea interna a  [[Prototype]] a unui obiect. For objects created using an object literal, this value is Object.prototype. Pentru obiecte create ca sa foloseasca array-uri litarale, aceasta valoare este  Array.prototype. Pentru functii, aceasta valoare este Function.prototype. Pentru obiecte create cu new fun, unde fun este un constructor de functie din JavaScript (Array, Boolean, Date, Number, Object, String, etc — incluzand noi constructori pe masura ce JavaScript progreseaza), aceasta valoare va fi mereu fun.prototype. Pentru obiecte create cu  new fun, unde fun e o functie definita in script,valoarea e  fun.prototype. (daca constructorul nu a returnat alt obiect explicit, sau  fun.prototype a fost reasignat de dupa ce a fost creata instanta).

Setter-ul__proto__ da voie [[Prototype]]-ului unui obiect sa fie  mutabil(the mutable) . Obiectul trebuie sa poata fi extins de  Object.isExtensible(): altfel, este aruncata o eroare: TypeError . Valoarea data trebuie sa fie ori un obiect ori un null. Un alt tip de valoarea nu va fi luata in considerare.

Pentru a intelege cum prototipurile sunt folosite pt mostenire, vezi nheritance and the prototype chain.

Proprietatea __proto__ este o proprietate de acces pe Object.prototype compusa din functii get si set. O proprietate de acces pentru __proto__ care consulta  Object.prototype va gasi aceasta proprietate. Daca alte proprietati __proto__ sunt agsite inainte caObject.prototype sa fie accesat,  proprietatea o va ascunde pe cea gasita in Object.prototype.

Specifications

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Object.prototype.__proto__' in that specification.
Standard Included in the (normative) annex for additional ECMAScript legacy features for Web browsers (note that the specification codifies what is already in implementations).
ECMAScript Latest Draft (ECMA-262)
The definition of 'Object.prototype.__proto__' in that specification.
Draft  

Browser compatibility

FeatureChromeEdgeFirefoxInternet ExplorerOperaSafari
Basic support Yes Yes111 Yes Yes
FeatureAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Basic support Yes Yes Yes4 Yes Yes Yes

Compatibility notes

While the ECMAScript 2015 specification dictates that support for __proto__ is required only for web browsers (although being normative), other environments may support it as well for legacy usage.

See also

Document Tags and Contributors

Contributors to this page: andreea96
Last updated by: andreea96,