2017-05-08 3 views
1

ich meine eigene new Funktion erstellt haben, die ein Objekt erstellt und gibt esIn Bezug auf das Schlüsselwort return

function Person(firstName, lastName) { 
    this.firstName = firstName 
    this.lastName = lastName 
} 

Person.prototype.getName = function() { 
    console.log(this.firstName + " " + this.lastName) 
} 

function spawn(constructor) { 
    var obj = {} 
    Object.setPrototypeOf(obj, constructor.prototype); 
    var myArray = Array.prototype.slice.apply(arguments) 
    return constructor.apply(obj, myArray.slice(1)) || obj 

} 

var crockford = spawn(Person, "Douglas", "Crockford") 
crockford.getName() 

Das Problem ist, dass, wenn ich die Rückkehr wie folgt festgelegt:

return constructor.apply(obj, myArray.slice(1)) || obj es funktioniert, aber wenn ich habe die Rückkehr wie folgt aus:

return obj || constructor.apply(obj, myArray.slice(1)) es sagt undefined

was ist der Unterschied zwischen diesen beiden?

Antwort

2

Wenn Sie obj || constructor.apply(obj, myArray.slice(1)) festlegen, ist der zurückgegebene Wert obj seit dem ersten Wert in der || Zustand war truthy. Wenn es falsch wäre, dann hätte es nur versucht, den anderen Teil zu bewerten.

Ihre obj ist jedoch not empty.

Die Zeile Object.setPrototypeOf(obj, constructor.prototype); wird in beiden Fällen ausgeführt, und der Prototyp von obj wird auf den Wert Person gesetzt, da constructor der Parameter in der Spawn-Funktion nichts anderes als Person ist.

Im ersten Fall aufgrund return constructor.apply(obj, myArray.slice(1)) || obj rufen Sie Person Funktion mit den Parametern Douglas und Crockford aber in zweitem Fall, dass Sie rufen Sie nicht auch die Konstruktor-Funktion.

Daher können firstName und lastName Eigenschaften nicht an das Objekt this angefügt werden.

Aufgrund des Fehlens von firstName- und lastName-Werten sehen Sie undefined undefined, während Sie im ersten Fall aufgrund des Aufrufs der Konstruktorfunktion Douglas Crockford gesehen haben.

Um klar zu sein return constructor.apply(obj, myArray.slice(1)) || obj wird zweiten Teil von || seit constructor.apply(obj, myArray.slice(1)) wird undefined zurückgeben. Die Eigenschaften firstName und lastName werden aufgrund von apply() an das Objekt obj selbst angehängt.

+0

Also wie 'constructor.apply (obj, myArray.slice (1))' ist falsch? –

+0

@AhMedRaXa Der Aufruf 'constructor.apply (obj, myArray.slice (1))' ruft die Person-Funktion mit Douglas und Crockford als Argumente auf. Wenn Sie also getName() aufrufen, hat die Funktion this.firstName und this.lastName. –

+0

Ich meinte, wie die Auswertung von 'constructor.apply (obj, myArray.slice (1))' ist falsch, so dass es die rechte Seite der '||' evaluiert? –

Verwandte Themen