2016-10-20 5 views
0

ich gelesen, dass, wenn ein Objekt wörtliche definiert ist, wird der Object-Konstruktor nicht aufgerufen:Warum der `Konstruktor` im folgenden auf Objekt verweist?

var ob1 = new Object(); // constructor called 
var ob2 = {}; // constructor never called 

Betrachten wir nun die folgenden:

// a constructor 
function Animal (name, food) { 
// definition of constructor 
} 

Animal.prototype = { 
    // some properties in the prototype 
    // but `constructor` is not set back to Animal 
} 

In dem obigen Code, weil ich völlig den Prototyp zu überschreiben bin Die constructot wird auf Object eingestellt. Wenn ich nicht falsch liege, wird die Konstruktoreigenschaft so eingestellt, dass sie auf den Konstruktor zeigt, der, wenn aufgerufen wird, bewirkt, dass der Prototyp erstellt wird. Meine Frage ist, obwohl ich den Prototyp vollständig neu definiere, wird der Objektkonstruktor nicht aufgerufen (weil es nur ein Objektliteral ist). Dann wieso die constructor auf Objekt zeigt.

+0

Die Eigenschaft 'constructor' wird normalerweise nicht vom Konstruktor selbst festgelegt. Es ist vorrausgesetzt, dass der Prototyp alle Instanzen erben soll. Wenn Sie auf 'new Animal(). Constructor' zugreifen, erhalten Sie den Wert von 'Object.prototype.constructor'. –

+0

@ Jonathan Lonowski bitte schreiben Sie eine Antwort und erarbeiten. –

+0

Wollen Sie sagen, dass die Konstruktoreigenschaft von Object.prototype geerbt wird? –

Antwort

1

warum die constructor auf Objekt verweist.

Die Eigenschaft und ihr Wert werden von Object.prototype übernommen.

Animal.prototype.constructor === Object.prototype.constructor; // true 

Da Animal.prototype ist eine Objektinstanz, von der wörtlichen/initializer erstellt, erbt es alle Eigenschaften von Object.prototype, seine constructor einschließlich.


Die constructor Eigenschaft wird in der Regel auf einem Prototyp-Objekt zugewiesen und von Instanzen geerbt.

Die Engine richtet so viel für Sie ein, aber nur einmal, wenn eine neue Funktion definiert ist.

function Animal() {} 

console.log(Animal.prototype.constructor); // function Animal() {} 

Die automatische Zuordnung nicht eingehalten wird, wenn Sie die prototype vollständig ersetzen.

Animal.prototype = {}; 

console.log(Animal.prototype.constructor); // function Object() {} 

Die constructor Eigenschaft ist auch nur zur Information bestimmt. Es bietet nicht wirklich eine Garantie für seine Genauigkeit, wie Sie gefunden haben, da es leicht geändert oder außer Kraft gesetzt werden kann.


Und eine Konstruktorfunktion Aufruf wird nicht automatisch die constructor Eigenschaft Wert für die neue Instanz zuordnen. Zumindest, wenn Sie definieren die Funktion, die explizit zu tun:

function Animal() { 
    this.constructor = Animal; 
} 

Animal.prototype = {}; 

console.log(new Animal().constructor); // function Animal() { ... } 

Ansonsten, da das modifizierte Animal.prototype nicht seine eigene ist die Angabe constructor ...

Animal.prototype.hasOwnProperty('constructor'); // false 

Es erbt diesen Wert aus den eigenen Prototyp:

Animal.prototype = { 
    constructor: Animal 
    // some properties in the prototype 
}; 

Oder wohl,:

Object.getPrototypeOf(Animal.prototype) === Object.prototype; // true 

Object.prototype.hasOwnProperty('constructor'); // true 

Object.prototype.constructor; // function Object() { } 
0

Wenn Sie den Prototyp eines Konstruktor ersetzen, können Sie immer den Konstruktor Eigenschaft zurückgedreht werden Sie sollten Prototypen nicht ersetzen, sondern nur erweitern:

Object.assign(Animal.prototype, { 
    // some properties in the prototype 
}); 
Verwandte Themen