JavaScript中的“新”运算符

时间:2013-04-02 16:42:27

标签: javascript constructor

我正在尝试了解new运算符。看看以下功能:

var _new = function(fn) {
    var obj = Object.create(fn.prototype);
    fn.apply(obj);
    obj.constructor = fn; // <--- EDIT: unnecessary
    return obj;
};

可以这样应用:

var Test = function(){
    this.foo = 1;
};

var instance = _new(Test);

当然它可以很容易地扩展到任意数量的参数(我只是想保持简单)。

它似乎与new关键字一样有效。那么有什么区别呢?还有new运算符对对象做了什么?

1 个答案:

答案 0 :(得分:3)

你是对的,这基本上是new正在做的事情:创建一个继承自Func.prototype的新对象,并使用Func调用this来引用这个新对象。

虽然您的实现略有不同:如果构造函数(Func返回对象,则this 隐式回。 如果它返回一个对象(任何对象),它将成为构造函数调用的返回值。

因此,更准确的复制将是:

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]]函数。究竟发生了什么在规范的section 13.2.2中描述,它与你(和我)写的函数几乎一样。

我不完全确定的是对象的内部[[Extensible]]属性设置为true。我假设您通过Object.create创建的每个对象都是可扩展的(如果它的原型是可扩展的)。