在func2
下面的代码段中,func1
应为the shorthand method syntax。
问题1 :为什么obj1
包含prototype
对象,而obj2
为什么不包含__proto__
对象?< / p>
问题2 :这三个对象都是原型对象吗?
问题3 :为什么obj2
没有原型功能的事实不影响它绑定this
的方式?
关于obj3
:obj3
可供参考,因为在没有obj2
功能方面,它等同于prototype
。它只是以不同的方式绑定this
(obj1
和obj1
this
由调用决定,而不是由封闭的上下文&#34;和{{ 1}} obj3
在词法上绑定到this
对象。两者都是nicely described in this article。)。
代码段:
window
&#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
对象只包含在其中一个中:
我查看了this和this关于prototype
和__proto__
之间区别的问题,但我的问题是关于为什么在使用了语法之后后者不存在的问题应该是等价的。
答案 0 :(得分:2)
为什么
obj1.bar
包含.prototype
对象而obj2.bar
不包含?{/ p>
因为它是方法定义。方法不是构造函数,它们不需要构造函数。 (它是相同的for class
methods和for arrow functions,顺便说一句。)
在obj2
中,您使用了function
表达式,该表达式创建了一个可用作构造函数的函数(如ES5中的情况一样)。
这三个对象都是原型对象吗?
对象不是“原型对象”。每个对象都可以用作其他对象的原型。
为什么
obj2.bar
没有.prototype
的事实不影响它绑定它的方式?
为什么会这样?它仍然是一个应该具有动态this
值的方法,否则无法共享。
只有您在obj3
中使用的箭头功能在这方面有特殊行为。有关详细信息,请参阅Methods in ES6 objects: using arrow functions。