Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么这个关键字与静态方法一起工作?_Javascript - Fatal编程技术网

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'