为什么使用速记方法语法的方法不包含原型对象

时间:2018-02-20 17:52:35

标签: javascript object javascript-objects

func2下面的代码段中,func1应为the shorthand method syntax

问题1 :为什么obj1包含prototype对象,而obj2为什么不包含__proto__对象?< / p>

问题2 :这三个对象都是原型对象吗?

问题3 :为什么obj2没有原型功能的事实不影响它绑定this的方式?

关于obj3 obj3可供参考,因为在没有obj2功能方面,它等同于prototype。它只是以不同的方式绑定thisobj1obj1 this由调用决定,而不是由封闭的上下文&#34;和{{ 1}} obj3在词法上绑定到this对象。两者都是nicely described in this article。)。

代码段

&#13;
&#13;
window
&#13;
&#13;
&#13;

我如何发现// 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不是

我在Chrome开发工具的控制台中查看了两个,发现func2对象只包含在其中一个中:

Screenshot of console with obj1 and obj2

我查看了thisthis关于prototype__proto__之间区别的问题,但我的问题是关于为什么在使用了语法之后后者不存在的问题应该是等价的。

1 个答案:

答案 0 :(得分:2)

  

为什么obj1.bar包含.prototype对象而obj2.bar不包含?{/ p>

因为它是方法定义。方法不是构造函数,它们不需要构造函数。 (它是相同的for class methodsfor arrow functions,顺便说一句。)
obj2中,您使用了function表达式,该表达式创建了一个可用作构造函数的函数(如ES5中的情况一样)。

  

这三个对象都是原型对象吗?

对象不是“原型对象”。每个对象都可以用作其他对象的原型。

  

为什么obj2.bar没有.prototype的事实不影响它绑定它的方式?

为什么会这样?它仍然是一个应该具有动态this值的方法,否则无法共享。

只有您在obj3中使用的箭头功能在这方面有特殊行为。有关详细信息,请参阅Methods in ES6 objects: using arrow functions