2010-10-04 10 views

Respuesta

6

Bueno, está el tema de que es __proto__ no estándar (link) y no es compatible con todas las implementaciones. :-) Aparte de eso, la propiedad constructor (link) no estaría configurada correctamente, probablemente tendrías que hacer eso tú mismo. Además, creo que sería mejor configurar el prototipo antes de llamando a la función de constructor. Por lo tanto:

function A(name) { 
    this.name = name; 
} 

var a1 = {}; 
a1.__proto__ = A.prototype; 
a1.constructor = A; // <=== Added this bit 
A.call(a1, "A1"); // <=== Moved this down 

Está cerca, sin embargo, al menos en las implementaciones que apoyan __proto__. No apostaría a que sea exactamente lo mismo. Vale la pena tener una lectura de la 5ª edición de especificaciones de ECMAScript para obtener más detalles, en particular las Secciones 11.2.2 "El operador new" y 13.2.2 "[[Construcción]]".

Algunas implementaciones que no son compatibles con __proto__ pueden admitir la nueva función Object.create definida por la 5ª especificación de edición (Sección 15.2.3.5), que le permite crear un objeto con un prototipo específico. En implementaciones que apoyan Object.create, el código de la creación de a1 se vería así:

var a1 = Object.create(A.prototype); 
a1.constructor = A; 
A.call(a1, "A1"); 

enrollarla, entonces:

function A(name) { 
    this.name = name; 
} 

if (typeof Object.create === "function") { 
    a1 = Object.create(A.prototype); 
} 
else if ({}.__proto__) { 
    a1 = {}; 
    a1.__proto__ = A.prototype; 
} 
else { 
    /* Fail */ 
} 
a1.constructor = A; 
A.call(a1, "A1"); 

... pero eso es completamente probada y, de nuevo, no lo haría cuente con que es exactamente lo mismo salvo una lectura muy cercana de la especificación de hecho.

Siempre que sea posible, por supuesto, si se trata de una función de constructor, recomendaría usarla de la forma habitual. Sin embargo, las herramientas avanzadas como __proto__ y Object.create son útiles para hacer herencia prototípica pura (sin función de constructor).

+0

Gran respuesta. Gracias. – zod

Cuestiones relacionadas