Welche Werte kann ein Konstruktor zurückgeben, dies zu vermeiden Rückkehr?

stimmen
83

Was sind die genauen Umstände , für die eine return - Anweisung in Javascript einen anderen Wert als zurückgeben kann , thiswenn ein Konstruktor aufgerufen wird mit newKeyword?

Beispiel:

function Foo () {
  return something;
}

var foo = new Foo ();

Wenn ich mich nicht irre, wenn somethingeine nicht-Funktion primitiv ist, thiswird zurückgegeben. Andernfalls somethingwird zurückgegeben. Ist das richtig?

IOW, welche Werte können somethingverursachen nehmen (new Foo () instanceof Foo) === false?

Veröffentlicht am 30/12/2009 um 03:08
quelle vom benutzer
In anderen Sprachen...                            


6 antworten

stimmen
-1

Wenn Sie das verwenden newSchlüsselwort wird ein Objekt erstellt. Dann wird die Funktion aufgerufen , das Objekt zu initialisieren.

Es gibt nichts, was die Funktion tun kann, wobei das Objekt erstellt zu verhindern, wie vor dem Aufruf der Funktion erfolgt.

Beantwortet am 30/12/2009 um 03:16
quelle vom benutzer

stimmen
2

Ich konnte keine Dokumentation zu diesem Thema finden, aber ich glaube , Sie richtig sind. Zum Beispiel können Sie wieder new Number(5)von einem Konstruktor, aber nicht die wörtliche 5(die ignoriert und thiszurückgegeben statt).

Beantwortet am 30/12/2009 um 03:27
quelle vom benutzer

stimmen
150

Der genaue Zustand wird auf der beschriebenen `Construct`interne Eigenschaft, die von dem verwendet wird , newBetreiber:

Von der ECMA-262 3.. Ausgabe-Spezifikation:

13.2.2 `Construct`

Wenn die `Construct`Eigenschaft für ein FunctionObjekt Faufgerufen wird, werden die folgenden Schritte unternommen:

  1. Erstellen Sie ein neues native ECMAScript-Objekt.
  2. Stellen Sie die `Class`Eigenschaft Result(1)auf "Object".
  3. Holen Sie sich den Wert der Eigenschaft prototype F.
  4. Wenn Result(3)ein Objekt ist, setzen Sie die `Prototype`Eigenschaft Result(1)auf Result(3).
  5. Wenn Result(3)kein Objekt ist, setzen Sie das `Prototype`von Eigentum Result(1)auf den ursprünglichen ObjectObjektprototyp wie beschrieben in 15.2.3.1 .
  6. Rufen Sie die `Call`Eigenschaft F, die Bereitstellung Result(1)als thisWert und die Argumentliste Bereitstellung ging in `Construct`als die Argumentwerte.
  7. Wenn Type(Result(6))ist Objectdann zurück Result(6).
  8. Rückkehr Result(1).

Schauen in den Schritten 7 und 8, wird das neue Objekt zurückgegeben werden , nur dann , wenn die Art des Result(6)(der Wert , aus dem zurückgegebenen F-Konstruktorfunktion) ist nicht ein Objekt ist .

Beantwortet am 30/12/2009 um 05:48
quelle vom benutzer

stimmen
0

Als Randbemerkung, der Rückgabewert oder thisist nur ein Teil der Gleichung.

Betrachten wir zum Beispiel diese:

function Two() { return new Number(2); }
var two = new Two;
two + 2; // 4
two.valueOf = function() { return 3; }
two + 2; // 5
two.valueOf = function() { return '2'; }
two + 2; // '22'

Wie Sie sehen können, .valueOf()wird intern verwendet und kann für Spaß und Profit ausgenutzt werden. Sie können auch Nebenwirkungen, zum Beispiel erstellen:

function AutoIncrementingNumber(start) {
    var n = new Number, val = start || 0;
    n.valueOf = function() { return val++; };
    return n;
}
var auto = new AutoIncrementingNumber(42);
auto + 1; // 43
auto + 1; // 44
auto + 1; // 45

Ich kann mir vorstellen , dies muss eine gewisse Art von praktischer Anwendung. Und es muss nicht explizit sein , Numberentweder, wenn Sie fügen .valueOfzu jedem Objekt , um es als eine Zahl verhalten kann:

({valueOf: function() { return Math.random(); }}) + 1; // 1.6451723610516638

Sie können dies nutzen, um ein Objekt zu machen, die immer eine neue GUID gibt, zum Beispiel.

Beantwortet am 08/10/2014 um 02:36
quelle vom benutzer

stimmen
2

Konkrete Beispiele http://jsbin.com/zivivucahi/1/edit?html,js,console,output

/*
ECMA 262 v 5
http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf
"4.3.2
primitive value
member of one of the types Undefined, Null, Boolean, Number, Symbol, or String as defined in clause 6"
*/

var Person = function(x){
  return x;

};


console.log(Person.constructor);
console.log(Person.prototype.constructor);
console.log(typeof(Person));
console.log(typeof(Person.prototype));

function log(x){
  console.log(x instanceof Person);
  console.log(typeof x);
  console.log(typeof x.prototype);
}

log(new Person(undefined));
log(new Person(null));
log(new Person(true));
log(new Person(2));
log(new Person(""));

//returns a function not an object
log(new Person(function(){}));


//implementation?
//log(new Person(Symbol('%')));
Beantwortet am 09/12/2015 um 14:17
quelle vom benutzer

stimmen
0

Der Versuch, ein paar Punkte in einfachen Worten zu fassen.

In JavaScript aktivieren, wenn Sie ein newSchlüsselwort auf eine Funktion , und wenn,

  1. Funktion gibt nichts zurück, wird es ein beabsichtigtes Objekt zurückgeben

function User() {
  this.name = 'Virat'
}

var user = new User();
console.log(user.name); //=> 'Virat'

  1. Funktion gibt jedes truthy komplexes Objekt [Objekt, ein Array - Funktion usw.], dass komplexes Objekt nimmt Priorität und userVariable wird das zurückgegebene komplexe Objekt hält

function User() {
  this.name = 'Virat';
  return function(){};
}

var user = new User();
console.log(user.name); //=> undefined
console.log(user); //=> function

  1. Funktion gibt jede wörtliche, Konstruktor nimmt Priorität und es wird ein beabsichtigtes Objekt zurückgeben

function User() {
  this.name = 'Virat';
  return 10;
}

var user = new User();
console.log(user.name); //=> 'Virat'

Beantwortet am 15/02/2019 um 15:48
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more