首页  >  文章  >  web前端  >  JavaScript“new”运算符如何发挥其魔力?

JavaScript“new”运算符如何发挥其魔力?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-10-28 12:56:01483浏览

How Does the JavaScript

解开 JavaScript“new”运算符的谜团

在 JavaScript 复杂性的深处隐藏着一个神秘的构造,因其潜在的令人困惑的潜力而闻名:“new”操作员。它的阴暗运作方式与原型链并存,让许多人迷失在代码的迷宫中。

深入研究 New Operator 的机制

揭开“新算子”的秘密" 操作符,让我们剖析一下它错综复杂的操作:

  • 它纠结了内部的 [[Construct]] 方法,这是 JavaScript 中无形的力量。
  • [[Construct]] 精心打造了一个原始的具有原生属性的对象。
  • 随后发生了微妙的舞蹈,其中对象的 [[Prototype]] 与 Function 原型相连。除非函数缺少对象原型(将其降级为原始值),否则 Object.prototype 会慷慨地介入来引导对象。
  • 然后,“new”运算符会精心策划该函数的一次盛大调用,赋予它新创建的对象作为其“this”值。
  • 出现了一个关键时刻:如果函数产生一个原始值,则内部生成的对象占据中心舞台。然而,如果返回一个对象,原始对象就会遗憾地消失。

替代镜头

进一步阐明神秘的“新”运算符,让我们探索一个反映其操作的替代实现:

<code class="javascript">function NEW(f) {
  var obj, ret, proto;

  // Prototype verification
  proto = Object(f.prototype) === f.prototype ? f.prototype : Object.prototype;

  // Object inheritance from `proto`
  obj = Object.create(proto);

  // Function invocation with object as "this"
  ret = f.apply(obj, Array.prototype.slice.call(arguments, 1));

  // Object return
  if (Object(ret) === ret) {
    return ret;
  }
  return obj;
}

// Demonstration:
function Foo(arg) {
  this.prop = arg;
}
Foo.prototype.inherited = 'baz';

var obj = NEW(Foo, 'bar');
console.log(obj.prop); // 'bar'
console.log(obj.inherited); // 'baz'
console.log(obj instanceof Foo); // true</code>

这段代码充当灯塔,阐明“新”运算符如何在幕后勤勉地履行其职责。

以上是JavaScript“new”运算符如何发挥其魔力?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn