我使用ECMAScript6实现客户端应用程序并使用JSHint进行静态代码分析。我经常在代码中使用以下模式:
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()即可。但是,如果没有将此添加到方法调用中,我就可以获得" myMethod'没有定义"来自JSHint的警告。我的问题是:
答案 0 :(得分:5)
不,这在JavaScript中从来都不正确。方法总是需要在接收器上明确地调用make this
work,并且需要使用属性访问表示法来引用它们,因为方法只是javascript中属性的函数。它们不能作为其他方法范围内的函数使用。 It's the same for properties,顺便说一句。
JsHint就在这里,没有理由拒绝警告。即使这可能,尽管如此,执行你的程序只会使它无效。
答案 1 :(得分:1)
在您提供的代码中,未定义标识符myMethod
,但定义了MyClass
实例的继承属性 myMethod 。
如果您在其他地方无法使用的闭包下定义myMethod
作为功能,那么您可以按照您希望的形式进行访问
var MyClass = (function () {
function myMethod() {
//Implementation
}
class MyClass {
constructor() {
myMethod();
}
}
return MyClass;
}());
我不会写很多ES6因此我不确定将function myMethod
放在MyClass
的定义内是否是 SyntaxError
但请注意,this
需要MyClass
来引用您MyMethod
的特定实例,因此如果您希望function myMethod(obj) {...}
// ...
myMethod(this);
对该实例执行操作,则可能需要在某处使用它。
class
如果您阅读MDN's description of class
ECMAScript 6 中引入了JavaScript类, JavaScript 现有的原型语法糖 - 基于继承。类语法不将新的面向对象的继承模型引入 JavaScript 。 JS类提供了一个更简单,更清晰的语法来创建对象和处理继承。
这就是说使用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;
}());
只是旧方法的简写,而不是新模型,因此如果用 ES5编写,可能更容易想到当前代码会是什么样子,
mark {
color: #CCC;
background: #333;
padding: 5px;
margin: 5px;
}
mark:nth-child(even) {
background: #000;
}
答案 2 :(得分:1)
在这种情况下拨打电话是否正确? (例如在...中 PHP总是需要添加$ this->到非静态方法调用)
不,不是。您始终必须指定方法的接收方。
如果在没有这个的情况下拨打电话是正确的,那就有任何办法(任何方式) .jshintrc flag)在JSHint中关闭此警告?
JSHint返回"' myMethod'没有定义"正确警告,因为在构造函数的范围内没有名为myMethod
的函数。