&引用;新";JavaScript中的运算符

&引用;新";JavaScript中的运算符,javascript,constructor,Javascript,Constructor,我正在努力理解新的操作符。请查看以下功能: var _new = function(fn) { var obj = Object.create(fn.prototype); fn.apply(obj); obj.constructor = fn; // <--- EDIT: unnecessary return obj; }; 当然,它可以很容易地扩展到任意数量的参数(我只是想保持简单) 它似乎像new关键字一样工作。那么,如果有的话,区别是什么呢?new

我正在努力理解
新的
操作符。请查看以下功能:

var _new = function(fn) {
    var obj = Object.create(fn.prototype);
    fn.apply(obj);
    obj.constructor = fn; // <--- EDIT: unnecessary
    return obj;
};
当然,它可以很容易地扩展到任意数量的参数(我只是想保持简单)


它似乎像
new
关键字一样工作。那么,如果有的话,区别是什么呢?
new
操作符对对象还做了什么?

您是对的,这基本上就是
new
所做的:创建一个从
Func.prototype
继承的新对象,并调用
Func
,使用
引用此新对象

不过,您的实现有一点不同:如果构造函数(
Func
)不返回对象,
将隐式返回此
。如果它返回一个对象(任何对象),那么它将成为构造函数调用的返回值

因此,更准确的复制是:

var _new = function(fn) {
    var obj = Object.create(fn.prototype);
    var result = fn.apply(obj);
    return result != null && typeof result === 'object' ? result : obj;
};
就这样。如果愿意,可以将其视为语法糖,就像条件运算符一样


指向引用的一些指针:当使用
new
时,将调用构造函数的内部
[[Construct]]]
函数。具体发生的情况在规范的第1部分中进行了描述,它与您(和我)编写的函数基本相同


我不能完全确定的一点是,对象的内部
[[Extensible]]
属性设置为
true
。我假设您通过
object.create
创建的每个对象在默认情况下都是可扩展的(如果它的原型是可扩展的)。

这有帮助吗<代码>构造函数实际上是
fn.prototype
的属性,而不是实例本身。@FelixKling哦,真的吗?我不知道。这使得代码更加简单。@Bergi是的,它是重复的(错过了那个)。显然,我可以投票结束我自己的问题。不错。:)哦,哇。这是一个有趣的特性。我一直认为构造函数返回什么并不重要。但我从未检查过这一点。:)谢谢你的回答!不客气:)添加了一些小注释……那么对象可扩展意味着什么呢?有不可扩展的物体吗?好问题。规范中说“如果为true,则可以将自己的属性添加到对象中。”。它似乎与有关,但我不知道这是否是唯一使用它的地方(在页面上搜索
[[Extensible]]]
可能会提供更多信息)。@freakish:(
.freeze()
.seal()
做类似的事情)
var _new = function(fn) {
    var obj = Object.create(fn.prototype);
    var result = fn.apply(obj);
    return result != null && typeof result === 'object' ? result : obj;
};