可能是JavaScript中鲜为人知的部分,位于原型链旁边。
所以问题是:如何…
new dataObj(args);
…实际上是创建一个对象,并定义其原型链/构造函数/等?
最好是显示一个替代方案,以充分理解该关键字。
的new操作者使用内部[[Construct]]方法,它基本上具有下列功能:
new
[[Construct]]
[[Prototype]]
prototype
Object.prototype
this
new运算符的等效实现可以这样表示(假设ECMAScript 5 Object.create方法可用):
Object.create
function NEW(f) { var obj, ret, proto; // Check if `f.prototype` is an object, not a primitive proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype; // Create an object that inherits from `proto` obj = Object.create(proto); // Apply the function setting `obj` as the `this` value ret = f.apply(obj, Array.prototype.slice.call(arguments, 1)); if (Object(ret) === ret) { // the result is an object? return ret; } return obj; } // Example usage: function Foo (arg) { this.prop = arg; } Foo.prototype.inherited = 'baz'; var obj = NEW(Foo, 'bar'); obj.prop; // 'bar' obj.inherited; // 'baz' obj instanceof Foo // true