一尘不染

新操作符如何在JavaScript中工作?

javascript

可能是JavaScript中鲜为人知的部分,位于原型链旁边。

所以问题是:如何…

new dataObj(args);

…实际上是创建一个对象,并定义其原型链/构造函数/等?

最好是显示一个替代方案,以充分理解该关键字。


阅读 273

收藏
2020-04-25

共1个答案

一尘不染

new操作者使用内部[[Construct]]方法,它基本上具有下列功能:

  • 初始化新的本机对象
  • 设置[[Prototype]]此对象的内部,指向Function prototype属性。
    • 如果函数的prototype属性不是对象(则使用原始值,例如Number,String,Boolean,Undefined或Null)Object.prototype
  • 创建对象后,它将调用该函数,并提供对象作为其this值。
  • 如果被调用函数的返回值是原始值,则返回内部创建的对象。
  • 否则,如果返回对象,则内部创建的对象将丢失。

new运算符的等效实现可以这样表示(假设ECMAScript 5 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
2020-04-25