javascript 中的静态方法可以调用非静态方法吗
Can static methods in javascript call non static
我很好奇,因为我收到 "undefined is not a function" 错误。考虑以下 class:
var FlareError = require('../flare_error.js');
class Currency {
constructor() {
this._currencyStore = [];
}
static store(currency) {
for (var key in currency) {
if (currency.hasOwnProperty(key) && currency[key] !== "") {
if (Object.keys(JSON.parse(currency[key])).length > 0) {
var currencyObject = JSON.parse(currency[key]);
this.currencyValidator(currencyObject);
currencyObject["current_amount"] = 0;
this._currencyStore.push(currencyObject);
}
}
}
}
currencyValidator(currencyJson) {
if (!currencyJson.hasOwnProperty('name')) {
FlareError.error('Currency must have a name attribute in the json.');
}
if (!currencyJson.hasOwnProperty('description')) {
FlareError.error('Currency must have a description attribute in the json.');
}
if (!currencyJson.hasOwnProperty('icon')) {
FlareError.error('Currency must have a icon attribute in the json.');
}
}
static getCurrencyStore() {
return this._currencyStore;
}
};
module.exports = Currency;
撇开重构不谈,问题在于:this.currencyValidator(currencyObject);
我收到错误 "undefined is not a function"
我想这是因为我有一个内部调用非静态方法的静态方法?那个非静态方法必须是静态的吗?如果是这样,this.methodName
的概念是否仍然有效?
从静态函数调用非静态函数在任何语言中都是没有意义的。静态(在此上下文中)意味着它基本上在对象之外,除了名称之外完全独立。它不绑定到任何实例,因此没有 this
或 self
来调用非静态(即成员)字段。
不行,一般静态方法是不能调用实例方法的。能够这样做意义不大。
唯一需要注意的是,没有什么可以阻止静态方法实例化 class 的实例,此时它可以以通常的方式调用实例方法。
不行,静态方法不能调用非静态方法。
假设您有对象 a
和 b
,它们都是 Currency
的实例。 currencyValidator
存在于这两个对象上。现在 store()
属于 class Currency
本身,而不是那些对象之一。那么,在 Currency.store()
中,它如何知道要在哪个对象上调用 currencyValidator()
?简单的答案是它没有,所以它不能。这是使用静态方法的陷阱之一,也是人们经常反对它们的原因之一。
无论如何,您可以通过将 a
传递给 Currency.store()
并改为调用 a.currencyValidator()
来解决这个问题。
我很好奇,因为我收到 "undefined is not a function" 错误。考虑以下 class:
var FlareError = require('../flare_error.js');
class Currency {
constructor() {
this._currencyStore = [];
}
static store(currency) {
for (var key in currency) {
if (currency.hasOwnProperty(key) && currency[key] !== "") {
if (Object.keys(JSON.parse(currency[key])).length > 0) {
var currencyObject = JSON.parse(currency[key]);
this.currencyValidator(currencyObject);
currencyObject["current_amount"] = 0;
this._currencyStore.push(currencyObject);
}
}
}
}
currencyValidator(currencyJson) {
if (!currencyJson.hasOwnProperty('name')) {
FlareError.error('Currency must have a name attribute in the json.');
}
if (!currencyJson.hasOwnProperty('description')) {
FlareError.error('Currency must have a description attribute in the json.');
}
if (!currencyJson.hasOwnProperty('icon')) {
FlareError.error('Currency must have a icon attribute in the json.');
}
}
static getCurrencyStore() {
return this._currencyStore;
}
};
module.exports = Currency;
撇开重构不谈,问题在于:this.currencyValidator(currencyObject);
我收到错误 "undefined is not a function"
我想这是因为我有一个内部调用非静态方法的静态方法?那个非静态方法必须是静态的吗?如果是这样,this.methodName
的概念是否仍然有效?
从静态函数调用非静态函数在任何语言中都是没有意义的。静态(在此上下文中)意味着它基本上在对象之外,除了名称之外完全独立。它不绑定到任何实例,因此没有 this
或 self
来调用非静态(即成员)字段。
不行,一般静态方法是不能调用实例方法的。能够这样做意义不大。
唯一需要注意的是,没有什么可以阻止静态方法实例化 class 的实例,此时它可以以通常的方式调用实例方法。
不行,静态方法不能调用非静态方法。
假设您有对象 a
和 b
,它们都是 Currency
的实例。 currencyValidator
存在于这两个对象上。现在 store()
属于 class Currency
本身,而不是那些对象之一。那么,在 Currency.store()
中,它如何知道要在哪个对象上调用 currencyValidator()
?简单的答案是它没有,所以它不能。这是使用静态方法的陷阱之一,也是人们经常反对它们的原因之一。
无论如何,您可以通过将 a
传递给 Currency.store()
并改为调用 a.currencyValidator()
来解决这个问题。