gpt4 book ai didi

javascript - 在类方法中访问对象属性

转载 作者:行者123 更新时间:2023-11-28 17:26:08 25 4
gpt4 key购买 nike

在许多其他问题中,解释了为什么下面的 Say 方法中的 this 并不总是引用 Foo 的对象。

class Foo {
constructor(){
this.bar = "baz";
}

Say(){
alert(this.bar);
}
}

我想确保 Say() 无论如何调用都会产生相同的警报。我只控制上面的代码,而不控制下面的示例。

var f = new Foo();
f.Say(); //"baz"
element.addEventListener("click", f.Say); //undefined
f.Say.call({bar: "no"}); //"no"

我大致了解如何使用函数构建实现。

function Foo(){
var bar = "baz";
return {
Say(){
alert(bar);
}
}
}

使用类语法可以保证这一点吗?

最佳答案

试试这个:

class Foo {
constructor(){
this.bar = "baz";
this.Say = this.Say.bind(this);
}

Say(){
alert(this.bar);
}
}

这样,您就可以强制 Say 方法的上下文始终为 this

您实际上是在向每个 Foo 实例添加一个与其原型(prototype)中的属性 Say 名称相同的新属性,因此这个新属性将优先于原型(prototype),并将其设置为相同的函数,但使用绑定(bind)强制上下文。

编辑:您可以使用如下方式自动化它:

class Foo {
constructor(){
this.bar = "baz";
Object.getOwnPropertyNames(this.constructor.prototype).forEach((i) => {
if (typeof this.constructor.prototype[i] == "function" && this.constructor.prototype[i] != this.constructor) {
this[i] = this.constructor.prototype[i].bind(this);
}
});
}

Say(){
alert(this.bar);
}
}
var f = new Foo();
f.Say();
f.Say.call({bar: "no"});

关于javascript - 在类方法中访问对象属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51565566/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com