我正在尝试了解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
运算符对对象做了什么?
答案 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
创建的每个对象都是可扩展的(如果它的原型是可扩展的)。