Hvilke verdier kan en konstruktør tilbake for å unngå å returnere denne?

stemmer
85

Hva er de eksakte omstendighetene som en retur uttalelse i Javascript kan returnere en annen verdi enn thisnår en konstruktør startes ved hjelp av newsøkeordet?

Eksempel:

function Foo () {
  return something;
}

var foo = new Foo ();

Hvis jeg ikke tar feil, hvis somethinger en ikke-funksjon primitive, thisvil bli returnert. Ellers somethinger returnert. Er dette riktig?

IOW, hvilke verdier kan somethingta for å forårsake (new Foo () instanceof Foo) === false?

Publisert på 30/12/2009 klokken 00:08
kilden bruker
På andre språk...                            


6 svar

stemmer
-1

Når du bruker newsøkeord, er et objekt opprettes. Deretter funksjonen kalles å initialisere objektet.

Det er ingenting som funksjonen kan gjøre for å hindre at objektet blir opprettet, som det er gjort før funksjonen kalles.

Svarte 30/12/2009 kl. 00:16
kilden bruker

stemmer
2

Jeg kunne ikke finne noen dokumentasjon om saken, men jeg tror du er riktig. For eksempel kan du returnere new Number(5)fra en konstruktør, men ikke bokstavelig 5(som er ignorert og thisreturneres i stedet).

Svarte 30/12/2009 kl. 00:27
kilden bruker

stemmer
153

Den eksakte tilstanden er beskrevet på den [[Construct]]indre egenskap, som blir brukt av newoperatøren:

Fra ECMA-262 tredje. Edition Spesifikasjon:

13.2.2 [[Construct]]

Når [[Construct]]eiendommen for en Functionobjekt Fkalles, er følgende trinn tatt:

  1. Opprett en ny opprinnelig ECMAScript objekt.
  2. Sett [[Class]]eiendom Result(1)til "Object".
  3. Få verdien av prototypen eiendom F.
  4. Hvis Result(3)er et objekt, sett [[Prototype]]eiendom Result(1)til Result(3).
  5. Hvis Result(3)ikke er et objekt, sett [[Prototype]]tilhører Result(1)den opprinnelige Objectprototype objekt som beskrevet i 15.2.3.1 .
  6. Påkalle den [[Call]]tilhører F, og gir Result(1)da thisverdi og gir argumentlisten ført inn [[Construct]]som argumentverdiene.
  7. Hvis Type(Result(6))er Objectderetter tilbake Result(6).
  8. Return Result(1).

Se i trinnene 7 og 8, den nye objektet vil bli returnert bare dersom den type av Result(6)(verdien som returneres fra den Fkonstruksjonsfunksjonen) er ikke et objekt.

Svarte 30/12/2009 kl. 02:48
kilden bruker

stemmer
0

Som en side note, returverdien eller thiser bare en del av ligningen.

For eksempel, tenk på dette:

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'

Som du kan se, .valueOf()brukes internt og kan utnyttes for moro skyld og fortjeneste. Du kan også lage bivirkninger, for eksempel:

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

Jeg kan tenke meg at dette må ha noen form for praktisk anvendelse. Og det trenger ikke å være eksplisitt en Numberheller, hvis du legger .valueOftil et objekt kan oppføre seg som et tall:

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

Du kan utnytte dette til å lage et objekt som alltid returnerer en ny GUID, for eksempel.

Svarte 07/10/2014 kl. 23:36
kilden bruker

stemmer
2

Konkrete eksempler 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('%')));
Svarte 09/12/2015 kl. 12:17
kilden bruker

stemmer
0

Prøver å sette noen punkter i enklere ord.

I javascript, når du bruker et newsøkeord på en funksjon, og hvis,

  1. Funksjonen returnerer ikke noe, vil den returnere en beregnet objekt

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

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

  1. Funksjonen returnerer en hvilken som helst truthy sammensatt gjenstand [objekt, matrise, funksjon etc], som komplekst objekt tar prioritet, og uservariable vil holde tilbake komplekst objekt

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

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

  1. Funksjonen returnerer en hvilken som helst bokstavelig, tar konstruktøren prioritet, og det vil returnere et objekt tiltenkt

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

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

Svarte 15/02/2019 kl. 13:48
kilden bruker

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