我正在学习有关javascript绑定的知识。我需要一些帮助。无法使用bind将原型函数与另一个函数连接。如果函数在类中,则可以使用。
示例:
let test = {};
test.gen = function () {
console.log(this.gender);
}
test.age = function () {
console.log(this.age);
}
class Human {
constructor(gender, age) {
this.gender = gender;
this.age = age;
}
printInfo() {
console.log(this.gender);
}
printGender = test.gen.bind(this);
// printAge = test.age.bind(this); // this works
}
Human.prototype.printAge = test.age.bind(this); // gives me undefined
let human = new Human('male', 30);
human.printInfo();
human.printGender();
human.printAge();
答案 0 :(得分:1)
@ noa-dev是正确的,因为this
调用中的bind
并不是您想要的。
您只需为原型提供功能即可正常工作:
Human.prototype.printAge = test.age
在test.age
的函数定义中,它要求this.age
。在这种情况下,this
由函数调用的调用上下文定义。通过将test.age
放置在Human
的原型上,Human
实例调用human.printAge()
使其具有human
作为调用上下文,因此this
引用到函数中正确的内容。
如果直接将test.age
放在实例上,则可以更明显地实现相同的行为:
let human = new Human('male', 30)
human.printAge = test.age
human.printAge() // 30
函数age
当前位于test
上的事实可能会引起麻烦,使您认为其中的this
只能引用{{1 }}。事实并非如此。此代码段也有效,它反映了根据调用的上下文来查询test
的行为:
this
答案 1 :(得分:-1)
想通了,我也可以在这里正确地编写它。
Human.prototype.printAge = test.age.bind(this); // gives me undefined
给您未定义的是,因为在javascript中,“ this”关键字始终引用下一个更大的包装函数范围。在您的情况下,很可能是窗口范围,而窗口却不知道类的内容。
为了实现所需的功能,可以将函数调用绑定到人类实例,如以下示例所示:
https://jsfiddle.net/v6ye2b0f/1/
class Human {
constructor(age) {
this.age = age || 0;
}
}
const human = new Human(30);
console.log(human.age); // 30;
const ageLogger = function() {
console.log(this.age);
}
Human.prototype.logAge = ageLogger.bind(human);
ageLogger.call(human); // 30
human.logAge(); // 30