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
objvara ett nyss skapat inbyggt ECMAScript-objekt....
8) Låt
resultvara resultatet av att anropa[[Call]]-egenskapen hosF, medobjsomthis-värde och med argumentlistan som skickades in i[[Construct]]som args.9) Om
Type(result)ärObjectså returneraresult.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.
