新操作员

The new Operator

本文关键字:操作员      更新时间:2023-09-26

是否可以编写遵循以下(有效)类型脚本接口的javascript函数:

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

即当用新运算符调用时返回字符串的东西。例如以下内容将不起作用。

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

您应该能够做到:

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

您可以返回任何对象,但文字不起作用。请参阅此处:构造函数可以返回哪些值来避免返回此值?

ECMAScript 5的第13.2.2节(关于[[Construct]]内部属性)对构造函数的返回值有这样的说明:

1) 让obj是一个新创建的本地ECMAScript对象。

8) 设result是调用F[[Call]]内部属性的结果,提供obj作为this值,并提供传递到[[Construct]]中的参数列表作为args。

9) 如果Type(result)Object,则返回result

10) 返回obj

因此,构造函数的返回值只能是一个对象。像"foo"这样的字符串基元具有String而不是ObjectType结果。这意味着步骤9为false,因此步骤10返回构造的对象,而不是构造函数的返回值。

相反,您必须返回一个对象(new String("foo")),如RobH的回答中所述。