簡體   English   中英

為什么使用速記方法語法的方法不包含原型對象

[英]Why does a method using the shorthand method syntax not contain a prototype object

在下面的代碼片段中, func2應該是func1 的簡寫方法語法

問題 1 :為什么obj1包含prototype Object 而obj2不包含(而兩者都有__proto__對象)?

問題2 :三個對象都是原型對象嗎?

問題 3 :為什么obj2沒有原型函數這一事實不會影響它綁定this

關於obj3obj3可以參考,因為它與obj2等價於沒有prototype函數。 它只是以不同的方式綁定this (在obj1obj1 this是“由調用決定,而不是由封閉上下文”決定,而在obj3 this是詞法綁定到window對象。本文中對兩者都有很好的描述。)。

代碼片段

 // Using the basic method definition const obj1 = { foo: function() { console.log("This is foo"); }, bar: function() { console.log("This is bar"); this.foo(); } }; // Using shorthand method syntax const obj2 = { foo() { console.log("This is foo"); }, bar() { console.log("This is bar"); this.foo(); } }; // Using arrow function const obj3 = { foo: () => console.log("This is foo"), bar: () => { console.log("This is bar"); this.foo(); } }; /* Test */ obj1.bar(); // works! obj2.bar(); // works! obj3.bar(); // throws TypeError (this.foo is not a function)

我如何發現func1是原型函數而func2不是

我在 Chrome Dev Tools 的控制台中查看了兩者,發現prototype對象僅包含在其中一個中:

帶有 obj1 和 obj2 的控制台屏幕截圖

我查看了這個這個關於__proto__prototype之間區別的問題,但我在這里的問題是關於為什么在使用應該等效的語法后后者不存在。

為什么obj1.bar包含.prototype Object 而obj2.bar不包含?

因為它是一個方法定義。 方法不是構造函數,它們不需要構造函數。 (順便說一句class方法箭頭函數也是如此。)
obj2您使用了一個function表達式,它創建了一個可以用作構造函數的函數(在 ES5 中一直是這種情況)。

三個對象都是原型對象嗎?

對象不是“原型對象”。 每個對象都可以用作或不用作其他對象的原型。

為什么obj2.bar沒有.prototype的事實不會影響它綁定 this 的方式?

為什么會呢? 它仍然是一個應該具有動態this值的方法,否則無法共享。

只有您在obj3使用的箭頭函數在這方面具有特殊行為。 有關詳細信息,請參閱ES6 對象中的方法:使用箭頭函數

暫無
暫無

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

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