Sto esaminando seriamente la specifica di ECMAScript 5.1.Non c'è modo di trovare il vero costruttore di un oggetto in JavaScript
E io sono curioso di sapere se c'è un modo per dire ciò che il "funzione di costruzione vera e propria" di un oggetto in ES5. (Non esplicita "costruttore" proprietà)
Secondo le specifiche, "costruttore" esplicito struttura dista iniziale indietro richiamo dal sottoprodotto oggetto di un oggetto funzione all'oggetto funzione.
(Qui, il sottoprodotto è l'oggetto che è inizialmente indicato dalla esplicita "prototipo" proprietà dell'oggetto funzione).
Quindi, esplicita "costruttore" la proprietà non ha nulla a che vedere con il vero costruttore di un oggetto:
function Foo(name){ this.name = name; }
var foo = new Foo("Brian");
var bar = { a: 10, b: function(){ if(this.name) return this.name; }};
Foo.prototype = bar;
var foo2 = new Foo("John"); // Let me call Foo as "real constructor" of foo2
Qui, anche se foo2 è stato creato da Foo, dal momento che Foo.prototype stava indicando al bar al momento della creazione di foo2, in modo da interno [[Prototype]] di foo2 arriva a puntare al bar, e possiamo controllare questo:
Object.getPrototypeOf(foo2) === bar // true
Dato foo2 non ha proprio "costruttore" di proprietà, come al solito, quindi, la lettura foo2.constructor è in realtà [[Prototype]] lookup catena, cioè foo2.constructor -.> ((Foo2 [[ Prototipo]])). Costruttore -> bar.constructor che è Object, non Foo.
È possibile controllare questo:
foo2.constructor === Foo // false
foo2.constructor === Object // true
Infine, non c'è un modo per trovare Foo dal foo2 oggetto?
ADD: Sto parlando di ES5. Si prega di non portare nulla di dipendente dal motore o ES6-thingy (ad esempio __proto__
)
Beh, ho intenzione di uscire su un arto qui e dire che non è possibile. Per quanto ne so, non c'è nulla che colleghi saldamente la funzione del costruttore con l'oggetto costruito. Puoi cambiare 'Foo.prototype' dopo aver creato l'oggetto e anche' foo2 instanceof Foo' non funzionerà più. Basti pensare alla funzione del costruttore come a una stampa blu. Lo usi per creare un oggetto ma dopo averlo creato, non c'è nulla che ti impedisca di fare cose completamente diverse per entrambi. – basilikum
Inoltre, non dimenticare che è perfettamente possibile per un costruttore restituire un oggetto completamente nuovo al posto dell'implicito 'return this', nel qual caso c'è assolutamente _no link_ alla funzione che lo ha creato. – Alnitak