2016-07-09 13 views
2

ich etwas testete, als ich bemerkt, dass, wenn Sie Objekt aus einer Funktion zurückkehren, wird seine Instanz nicht custom prototype functionsInstanz haben keinen Zugriff auf die Prototyp-Funktionen, wenn übergeordnete Funktion gibt ein Objekt

// This works 
 
function bar(){ 
 
    var test = "test"; 
 
    return test; 
 
} 
 

 
bar.prototype.notify = function(){console.log("Hello Bar");} 
 
var b = new bar(); 
 
b.notify() 
 

 
function bar1(){ 
 
    var test = "test"; 
 
    return {test: test}; 
 
} 
 
bar1.prototype.notify = function(){console.log("Hello Bar");} 
 
var b1 = new bar1(); 
 
b1.notify()

Hinweis:Javascript Prototype not Working ist ein ähnlicher Beitrag, aber ich suche nach Gründen, warum es nicht zugänglich ist.

+1

Wenn Rückgabewert ist "primitiv", es wird ignoriert. Wenn 'object' zurückgegeben wird, hat die Variable hold das zurückgegebene Objekt. – Rayon

+0

Es gibt keinen Grund,' new' zu verwenden, wenn Sie etwas anderes als 'this' zurückgeben, und wenn Sie nicht verwenden, können Sie keine Protos verwenden, und wenn Sie keine Protos verwenden können, dann haben Sie nur Fabriken, keine Konstruktoren. – dandavis

+0

Nun, das ist, weil, wenn Sie keine Instanz zurückgeben, es keine Instanz ist? – Bergi

Antwort

1

Im ersten Fall verwenden Sie das Konstruktormuster. So wird die this auf das neue Objekt gebunden Sie erstellen,

var b = new bar(); 

Davon abgesehen, da der Konstruktor der Prototyp einer Funktion notify genannt enthält, wird diese Funktion ist von jedem Objekt wird wie oben erstellt. (als Seitenknoten bedenken Sie, dass es eine Konvention ist, dass der erste Buchstabe einer Konstruktorfunktion, eine Funktion, die nur zum Erzeugen eines neuen Objekts unter Verwendung des neuen Operators verwendet wird, Großbuchstabe ist. Auf diese Weise unterscheidet sich eine Konstruktorfunktion von den Restfunktionen .)

auf der anderen Seite, im folgenden Fall:

function bar1(){ 
    var test = "test"; 
    return {test: test}; 
} 

die return Anweisung das Standardverhalten außer Kraft gesetzt und es ein neues Objekt zurückgibt.

Wie es in MDN beschrieben:

Wenn der Code new Foo (...) ausgeführt wird, die folgenden Dinge passieren:

  1. ein neues Objekt erstellt wird, erbt von Foo .Prototyp.
  2. Die Konstruktorfunktion Foo wird mit den angegebenen Argumenten aufgerufen und damit an das neu erstellte Objekt gebunden. new Foo ist entspricht dem neuen Foo(), d. h. wenn keine Argumentliste angegeben ist, wird Foo ohne Argumente aufgerufen.
  3. Das von der Konstruktorfunktion zurückgegebene Objekt wird zum Ergebnis des gesamten neuen Ausdrucks. Wenn die Konstruktorfunktion kein Objekt explizit zurückgibt, wird stattdessen das in Schritt 1 erstellte Objekt verwendet. (Normalerweise Konstrukteure zurückkehren keinen Wert, aber sie können entscheiden, dies zu tun, wenn sie das normale Objekterstellung Prozess außer Kraft setzen möchten.)

// This works 
 
function bar(){ 
 
    var test = "test"; 
 
    return test; 
 
} 
 

 
bar.prototype.notify = function(){console.log("Hello Bar");} 
 
var b = new bar(); 
 
document.write('b constructor is:'+ b.constructor); 
 
document.write('</br>') 
 

 
function bar1(){ 
 
    var test = "test"; 
 
    return {test: test}; 
 
} 
 

 
var b1 = new bar1(); 
 
document.write('b1 constructor is:'+ b1.constructor);

Verwandte Themen