Javascript 在类方法中访问对象属性

Javascript 在类方法中访问对象属性,javascript,this,Javascript,This,在许多其他问题中,解释了为什么下面的Say方法中的这个并不总是指Foo的对象 class Foo { constructor(){ this.bar = "baz"; } Say(){ alert(this.bar); } } 我想确保无论如何调用,Say()都会产生相同的警报。 我只控制上面的代码,不控制下面的示例 var f = new Foo(); f.Say();

在许多其他问题中,解释了为什么下面的Say方法中的
这个
并不总是指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
实例添加一个新属性,该属性与原型中的属性
Say
同名,因此该新属性将优先于原型,并将其设置为相同的函数,但使用绑定强制上下文

编辑:您可以通过以下方式实现自动化:

class-Foo{
构造函数(){
this.bar=“baz”;
Object.getOwnPropertyNames(this.constructor.prototype).forEach((i)=>{
if(this.constructor.prototype[i]=“function”&&this.constructor.prototype[i]!=this.constructor){
this[i]=this.constructor.prototype[i].bind(this);
}
});
}
说(){
警报(此.bar);
}
}
var f=新的Foo();
f、 Say();
f、 Say.call({bar:“no”})请尝试以下操作:

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

    Say(){
        alert(this.bar);
    }
}
这样,您就可以强制
Say
方法的上下文始终是
this

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

编辑:您可以通过以下方式实现自动化:

class-Foo{
构造函数(){
this.bar=“baz”;
Object.getOwnPropertyNames(this.constructor.prototype).forEach((i)=>{
if(this.constructor.prototype[i]=“function”&&this.constructor.prototype[i]!=this.constructor){
this[i]=this.constructor.prototype[i].bind(this);
}
});
}
说(){
警报(此.bar);
}
}
var f=新的Foo();
f、 Say();

f、 Say.call({bar:“no”})
No,不是使用
class
语法,而是当您绑定事件处理程序时,您还可以将函数绑定到
f
。No,不是使用
class
语法,而是当您绑定事件处理程序时,您还可以将函数绑定到
f
。这难道不使得
Say()
完全多余吗?我们能不能只定义
这个。把
说成一个箭头函数,而忘记
说()
?这似乎是合法的,但不会强迫你总是显式地绑定类方法。我的意思是如果你有很多方法,这就意味着你需要写很多bind语句also@MarkMeyer是的。但是当我这样做时,我更喜欢保持这种方式,因为我喜欢在原型中定义类方法,但只是作为一种约定。也许在未来我不需要绑定,所以我可以直接删除该行并保留该方法,而无需做太多工作,或者可能某个地方有一个类帮助程序可以通过coConstructor原型访问这些方法,无论出于什么原因。。。我不知道,我只是喜欢这样做时感到“安全”xD@FayçalArab你可以创建我说的助手。编辑了答案。这听起来很合理@JorgeFuentesGonzálezDoesn这不是让
Say()
完全多余吗?我们能不能只定义
这个。把
说成一个箭头函数,而忘记
说()
?这似乎是合法的,但不会强迫你总是显式地绑定类方法。我的意思是如果你有很多方法,这就意味着你需要写很多bind语句also@MarkMeyer是的。但是当我这样做时,我更喜欢保持这种方式,因为我喜欢在原型中定义类方法,但只是作为一种约定。也许在未来我不需要绑定,所以我可以直接删除该行并保留该方法,而无需做太多工作,或者可能某个地方有一个类帮助程序可以通过coConstructor原型访问这些方法,无论出于什么原因。。。我不知道,我只是喜欢这样做时感到“安全”xD@FayçalArab你可以创建我说的助手。编辑了答案。这听起来很合理@JorgeFuentesGonzález