javascript - Den nya operatorn


Är det möjligt att skriva en JavaScript-funktion som följer detta (giltiga) TypeScript-gränssnitt:

interface Foo{
    // constructor: 
    new (): string; 
}

d.v.s. Något som när det anropas med en ny operator returnerar en sträng. t.ex. följande kommer inte att fungera.

function foo(){
    return "something";
} 
var x = new foo(); 
// x is now foo (and not string) whether you like it or not :) 

Svar #1

Du bör kunna göra:

function foo(){
    return new String("something");
} 
var x = new foo(); 

console.log(x);

Du kan returnera vilket objekt som helst, men literaler fungerar inte. Se här: Vilka värden kan en konstruktor returnera för att undvika att returnera detta?

Svar #2

ECMAScript 5:s Avsnitt 13.2.2 (om den interna egenskapen [[Construct]]) säger följande om returvärdet från en konstruktor:

1) Låt obj vara ett nyss skapat inbyggt ECMAScript-objekt.

...

8) Låt result vara resultatet av att anropa [[Call]]-egenskapen hos F, med obj som this-värde och med argumentlistan som skickades in i [[Construct]] som args.

9) Om Type(result) är Object så returnera result.

10) Returnera obj.

Således kan returvärdet av en konstruktor endast vara ett objekt. En strängprimitive som "foo" har ett Type-resultat av String snarare än Object. Detta betyder att steg 9 är falskt, så steg 10 returnerar det konstruerade objektet istället för returvärdet från konstruktionsfunktionen.

Istället måste du returnera ett objekt (new String("foo")), som detaljerat i RobH:s svar.

Relaterade artiklar