javascript中的静态方法可以非静态调用

时间:2015-10-27 15:17:40

标签: javascript class ecmascript-6 static-methods

我很好奇,因为我得到了一个" 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);的概念仍然有用吗?

2 个答案:

答案 0 :(得分:10)

不,静态方法不能调用非静态方法。

请考虑您有ab两个实例的对象CurrencycurrencyValidator。这两个对象上存在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)

用任何语言从静态函数中调用非静态函数是没有意义的。静态(在此上下文中)意味着它基本上在对象之外,除了名称之外都是独立的。它不依赖于任何实例,因此没有thisself来调用非静态(即成员)字段。