我很好奇,因为我得到了一个" undefined不是一个函数"错误。考虑以下课程:
android:datePickerMode="spinner"
重构除外,问题就在于: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;
我收到错误" undefined不是函数"
我认为这是因为我有一个静态方法,他们的内部调用非静态方法?这种非静态方法必须是静态的吗?如果是this.currencyValidator(currencyObject);
的概念仍然有用吗?
答案 0 :(得分:10)
不,静态方法不能调用非静态方法。
请考虑您有a
和b
两个实例的对象Currency
和currencyValidator
。这两个对象上存在store()
。现在Currency
属于类Currency.store()
本身,而不属于其中一个对象。那么,在currencyValidator()
中,它如何知道调用a
的对象?简单的答案是它不能这样做。这是使用静态方法的一个缺陷,也是人们经常反对它们的原因之一。
无论如何,您可以将Currency.store()
传递到a.currencyValidator()
,然后拨打UIView *newView = [[UIView alloc] initWithFrame:CGRectMake(0,CGRectGetMaxY(phoneTextField.frame)+0,[TPRConstants screenWidth],50);
newView.backgroundColor = [UIColor blueColor];
[self.view addSubview:newView];
来解决此问题。
答案 1 :(得分:1)
用任何语言从静态函数中调用非静态函数是没有意义的。静态(在此上下文中)意味着它基本上在对象之外,除了名称之外都是独立的。它不依赖于任何实例,因此没有this
或self
来调用非静态(即成员)字段。