Javascript 带有ECMAScript 6的JSHint:未定义方法
我正在使用ECMAScript 6实现一个客户端应用程序,并用于静态代码分析。我经常在代码中使用以下模式:Javascript 带有ECMAScript 6的JSHint:未定义方法,javascript,ecmascript-6,jshint,Javascript,Ecmascript 6,Jshint,我正在使用ECMAScript 6实现一个客户端应用程序,并用于静态代码分析。我经常在代码中使用以下模式: class MyClass { constructor() { //This is how I would like to call myMethod myMethod(); //This is how I should call myMethod to make JSHint analysis pass this
class MyClass {
constructor() {
//This is how I would like to call myMethod
myMethod();
//This is how I should call myMethod to make JSHint analysis pass
this.myMethod();
}
myMethod(){
//Implementation
}
}
我的主要语言是Java,因此我希望只需调用myMethod()就可以了。然而,如果不向方法调用添加这个,我将从JSHint得到“myMethod”未定义的警告。我的问题是:
不,这在JavaScript中是正确的,而且从来都不正确。方法总是需要在接收方上显式地调用,并且需要使用属性访问表示法来引用它们,因为方法只是javascript中属性上的函数。它们在其他方法的作用域中不可用,顺便说一句
JsHint就在这里,没有理由关闭该警告。即使这是可能的,尽管这样执行程序也会使其无法工作。在您提供的代码中,没有定义标识符
myMethod
,但定义了MyClass
实例的继承属性myMethod
如果您将myMethod
定义为闭包下的函数,而闭包在其他地方不可用,那么您可以按照您所需的形式访问它
var MyClass = (function () {
function myMethod() {
//Implementation
}
class MyClass {
constructor() {
myMethod();
}
}
return MyClass;
}());
我没有编写太多ES6,因此我不确定将函数myMethod
放在MyClass
的定义中是否是语法错误
但是,请注意,此
是引用您的MyClass
的特定实例所必需的,因此如果您希望MyMethod
对该实例执行操作,您可能需要在某个地方使用它
function myMethod(obj) {...}
// ...
myMethod(this);
如果你读了 JavaScript类是在ECMAScript 6中引入的,并且是语法上的糖,而不是JavaScript现有的基于原型的继承。类语法是而不是,它向JavaScript引入了一个新的面向对象继承模型。JS类提供了一种更简单、更清晰的语法来创建对象和处理继承 这意味着使用
class
只是旧方法的简写,而不是新模型,因此,如果使用ES5编写当前代码,您可能会更容易想到它是什么样子
在这种情况下不打这个电话对吗?(例如在
PHP您始终需要将$this->添加到非静态方法调用中)
不,不是。您必须始终指定方法的接收者
如果这是正确的打电话没有这是有任何方法(任何
.jshintrc标志)关闭JSHint中的此警告
JSHint正确返回“myMethod”警告,因为构造函数的作用域中没有调用函数myMethod
var MyClass = (function () {
function MyClass() {
this.constructor.apply(this, arguments);
}
MyClass.prototype = Object.create(null);
MyClass.prototype.constructor = function () {
myMethod(); // referenceError
this.myMethod(); // works
};
MyClass.prototype.myMethod = function () {
//Implementation
};
return MyClass;
}());