当前位置: 首页 > 面试题库 >

ES6箭头功能在原型上不起作用?

松翔
2023-03-14
问题内容

当ES6 Arrow函数似乎无法为使用prototype.object的对象分配功能时。请考虑以下示例:

function Animal(name, type){
 this.name = name;
  this.type = type;
  this.toString = () => `${this.name} is a ${this.type}`;

}
var myDog = new Animal('Max', 'Dog');
console.log(myDog.toString()); //Max is a Dog

在对象定义中显式使用arrow函数是可行的,但将Object函数与Object.prototype语法一起使用却不能:

function Animal2(name, type){
  this.name = name;
  this.type = type;
}
Animal2.prototype.toString = () => `${this.name} is a ${this.type}`;

var myPet2 = new Animal2('Noah', 'cat');
console.log(myPet2.toString()); //is a undefined

就像概念证明一样,将Template字符串语法与Object.prototype语法一起使用确实可以:

function Animal3(name, type){
  this.name = name;
  this.type = type;
}
Animal3.prototype.toString = function(){ return `${this.name} is a ${this.type}`;}

var myPet3 = new Animal3('Joey', 'Kangaroo');
console.log(myPet3.toString()); //Joey is a Kangaroo

我是否缺少明显的东西?我觉得示例2应该在逻辑上起作用,但是我对输出感到困惑。我猜这是一个范围界定的问题,但是输出“是未定义的”让我望而却步。


问题答案:

箭头函数提供了一个词法this。它使用this功能评估时可用的。

从逻辑上讲,它等效于(以下无效代码,因为您不能拥有名为的变量this):

(function(this){
   // code that uses "this"
 })(this)

在您的第一个示例中,arrow函数在构造函数中,并this指向新生成的实例。

在您的第三个示例中,未使用箭头函数,并且标准this行为照常运行(函数范围中的this)。

在第二个示例中,您使用了箭头功能,但是在评估范围内,它this是全局的/未定义的。



 类似资料:
  • 作为概念证明,将模板字符串语法与Object.Prototype语法一起使用确实有效: 我是不是漏掉了一些明显的东西?我觉得示例2在逻辑上应该工作,但我对输出感到困惑。我猜这是一个范围问题,但我被输出“是一个未定义的”抛了出来。 ES6小提琴

  • 问题内容: 这是在我的Angular代码中正常工作的ES5函数: 我想将其转换为ES6箭头功能 但是它给出了错误 ES6箭头功能是否与Angular不兼容? 编辑:我想也许Angular不能推断出该名称,因此无法注入它,但随后我将其记录到控制台,并确实显示了它: 问题答案: 正确。您的AngularJS版本与使用$ injector的箭头功能不兼容。 这主要是因为AngularJS 1.4.6使用

  • 问题内容: 我正在学习Vue并在计算属性中使用箭头功能时遇到问题。 我的原始代码工作正常(请参见下面的代码段)。 但是,更改计算属性中的方法后,颜色不会更改(尽管turnRed值仍成功在true和false之间切换)。 这是我的代码: 我使用错误的语法吗? 问题答案: 您遇到此错误是因为箭头函数不会绑定到您要为其定义计算属性的vue实例。如果要使用箭头功能进行定义,也会发生同样的情况。 不要在实例

  • 问题内容: 下面的代码在IE 11中不起作用,它在控制台中引发语法错误 使用二部图进行可视化 此代码导致上述声明中的问题 问题答案: 您正在使用箭头功能。IE11不支持它们。使用函数代替。 这是Babel将其翻译成ES5的内容:

  • 问题内容: 我在使用胖箭头功能时遇到了一些问题。如果该函数不是匿名函数,它将抱怨语法并且不会编译。 这个: 给我: 它指向等号(handleItemClick’=’)。 但是,这很好用: 我的webpack配置是否有问题,或者我缺少什么?感谢任何提示。 问题答案: 您正在尝试使用不属于ES6且es2015未涵盖的class字段,并对预设进行反应。 您可以使用Class属性transform bab

  • 问题内容: 我在一个Angular示例中遇到了这个构造,我想知道为什么选择了这个构造: 我了解变量_表示不在乎/不使用,但是由于它是唯一的变量,因此没有任何理由更喜欢使用_: 当然,输入的字符数不能少于一个。在我看来,()语法可以更好地传达意图,并且还更具体地说明类型,因为否则我认为第一个示例应该看起来像这样: 万一重要,这是使用它的上下文: 问题答案: 之所以可以使用此样式(可能是在此处使用该样