[英]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
?
關於obj3
: obj3
可以參考,因為它與obj2
等價於沒有prototype
函數。 它只是以不同的方式綁定this
(在obj1
和obj1
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
對象僅包含在其中一個中:
我查看了這個和這個關於__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.