Javascript 为什么这个关键字与静态方法一起工作?
为什么要这样做?我以前认为在这种情况下会出现致命错误。当您通过诸如Javascript 为什么这个关键字与静态方法一起工作?,javascript,Javascript,为什么要这样做?我以前认为在这种情况下会出现致命错误。当您通过诸如someobject.property()之类的引用调用函数时,this值将设置为someobject。这是语言的一个基本特征。静态方法是构造函数的属性,因此,当您通过对构造函数的引用调用它们时,this的值就是该函数。在JS中,this与实际的OO语言(如Java等)中的this不同。在Java中,this指的是类的当前对象,而在JS中,则没有“类”,这个在JS中只是指当前的上下文范围,在您的例子中,它可能是“类”上的“静态”方
someobject.property()
之类的引用调用函数时,this
值将设置为someobject
。这是语言的一个基本特征。静态方法是构造函数的属性,因此,当您通过对构造函数的引用调用它们时,this
的值就是该函数。在JS中,this
与实际的OO语言(如Java等)中的this不同。在Java中,this
指的是类的当前对象,而在JS中,则没有“类”,这个
在JS中只是指当前的上下文范围,在您的例子中,它可能是“类”上的“静态”方法,本质上可以归结为Java等语言中普通旧对象的当前范围,静态方法属于一个类而不是一个实例,因此当您在static
方法中使用this
时,会出现编译错误,因为该方法不知道引用哪个实例(因为该类可能有多个实例)
但是类
只是JavaScript函数
对象的一个语法糖,因此当您调用StaticMethodCall.anotherStaticMethod()时
此处此
将指向StaticMethodCall
类
对象的上下文,该对象只不过是引擎盖下的函数
对象。JavaScript函数也是可以声明属性的对象。因此,当您使用构造函数(es6类)时,您可以在函数对象上声明属性,该对象在es6中只是静态的
让我这样解释,如果您通过Babel将其传输到es5,下面的代码就是引擎盖下发生的事情:
//这就是es6类中static的含义。它们是构造函数的属性
函数StaticMethodCall(){//这表示您的类
}
StaticMethodCall.staticMethod=函数(){
返回“已调用静态方法”;
}
StaticMethodCall.anotherStaticMethod=函数(){
从另一个静态方法“”返回此.staticMethod()+';
}
log(StaticMethodCall.staticMethod());
//StaticMethodCall是指向的类对象的引用。
log(StaticMethodCall.anotherStaticMethod())代码>为了更好地理解它,您应该检查从
静态函数的作用域与类的作用域相同(编译的类是构造函数
函数)
静态函数在构造函数上声明为属性,无论普通函数是否在构造函数上声明为属性。原型
,因此在所有实例上都可用。从那时起我就知道了。。。。。有趣的是,在这个案例中,我之前就预料到了致命的错误——你为什么会这样想?您甚至可以在顶级函数中编写this
,比如functiontest(x){this.something=x;}
,它会做一些事情。
class StaticMethodCall {
static staticMethod() {
return 'Static method has been called';
}
static anotherStaticMethod() {
return this.staticMethod() + ' from another static method';
}
}
StaticMethodCall.staticMethod();
// 'Static method has been called'
StaticMethodCall.anotherStaticMethod();
// 'Static method has been called from another static method'