簡體   English   中英

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

[英]How does the new operator work in JavaScript?

可能是 JavaScript 中最不為人知的部分,站在原型鏈旁邊。

那么問題來了:怎么...

new dataObj(args); 

...實際上創建一個 object,並定義其原型鏈/構造函數/等?

最好是顯示一個替代方案,以完全理解這個關鍵字。

new運算符使用內部的[[Construct]]方法,它基本上做了以下工作:

  • 初始化一個新的原生 object
  • 設置此 object 的內部[[Prototype]] ,指向 Function prototype屬性。
    • 如果函數的prototype屬性不是 object(原始值,例如數字、字符串、Boolean、未定義或 Null),則使用Object.prototype
  • 創建 object 后,它調用 function,提供 object 作為this值。
  • 如果調用的 function 的返回值是原語,則返回內部創建的 object。
  • 否則,如果返回 object,則內部創建的 object 將丟失。

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

表達式new C(arg1, arg2)

假設 C 是 JavaScript function (否則會出現錯誤):

  1. 創建一個新的空 object(無屬性)
  2. 將新 object 的原型設置為C的“ prototype ”屬性的值。
    • Note: The default value of prototype for a function is an object (automatically created when the function is declared) with its prototype set to Object.prototype and a constructor property pointing back to the function C .
    • 注意:術語可能會造成混淆。 名為“prototype”的屬性object 的原型不同。 只有函數具有名為“原型”的屬性,但所有對象都有原型。
  3. 調用 function C並將“ this ”設置為新的 object,並使用提供的 ZDBC16FB4CAA5BDA8EDDAZ77。
  4. 如果調用 function C返回 object,則此 ZA8CFDE6331BD59EB2AC96F8911C4B6 的結果為。 否則新創建的 object 是表達式的結果。

ECMAScript 5 中new的替代方法是使用內置的Object.createObject方法。

new C(arg1, arg2)相當於:

var obj = Object.createObject(C.prototype);
C.apply(obj, [arg1, arg2]);

標准 JavaScript 不允許您顯式設置 object 的原型,因此Object.createObject無法在語言本身中實現。 一些實現確實允許它通過非標准屬性 __proto__。 在這種情況下,可以像這樣模擬new C

var obj = {};
obj.__proto__ = C.prototype;
C.apply(obj, [arg1, arg2]);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM