我有以下代码:
class Pet {
constructor(name) {
this.petName = name;
}
}
Pet.prototype.speak = {
name: function() {
console.log(this.petName);
}
};
// -----------------------------------------------
const myPet = new Pet("Max");
myPet.speak.name();
我希望此代码可以打印Max
,但是可以打印undefined
。
如果我将console.log更改为console.log(this);
,则会显示{ name: [Function: name] }
。这使我认为该函数无权访问实例属性。
如何确保此功能可以访问实例?
答案 0 :(得分:2)
如果您要定位或支持ES6语言功能,一种实现目标的方法是将get
方法与arrow function
结合使用。
get
方法将被声明为get speak()
,这意味着它可以在没有括号的情况下被调用。此方法将返回一个包含name()
箭头函数的对象。使用箭头功能可以让您通过Pet
关键字直接访问封闭的this
实例:
class Pet {
constructor(name) {
this.petName = name;
}
// Get method allows the speak method to be called without ()
get speak() {
return {
// Arrow function causes this.petName to refer to petName
// field of this class instance
name: () => {
console.log(this.petName);
}
}
}
}
const myPet = new Pet("Max");
myPet.speak.name();
const yourPet = new Pet("Min");
yourPet.speak.name();
答案 1 :(得分:1)
当您调用这样的函数时:myPet.speak.name();
,然后在该函数中this
指的是myPet.speak
。在您的情况下,这是一个具有一个属性(名称)的对象,其值是一个函数。
如果将speak
本身作为函数而不是对象,并使用属性petName
代替name
,它将起作用:
class Pet {
constructor(name) {
this.petName = name;
}
}
Pet.prototype.speak = function() {
// myPet has a `petName` property, but no `name` property
console.log(this.petName);
};
const myPet = new Pet("Max");
myPet.speak(); // this will be `myPet` inside the function