2

我试图了解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运算符对对象还有什么作用?

4

1 回答 1

3

你是对的,这基本上new是在做什么:创建一个继承自该新对象并引用该新对象进行Func.prototype调用的新对象。Functhis

不过,您的实现略有不同:如果构造函数 ( 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]]函数被调用。规范的第 13.2.2 节描述了究竟发生了什么,它与您(和我)编写的函数几乎相同。

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

于 2013-04-02T16:48:51.290 回答