JS中缺少方法

时间:2014-04-02 08:38:30

标签: javascript prototypal-inheritance

在python中,我可以这样做:

class Converter(object):
    def __init__(self, amount):
        self.amount = amount

    def rupy(self):
        return self.amount * 2

    def __getattr__(self, *args, **kwargs):
        if args[0] == 'rupies':
            return self.rupy

JS是否提供了一些实现相同行为的方法?我搜索了一下,找到了关于noSuchMethod的文章,但它仅适用于Firefox。

编辑:我不想要别名我希望有办法处理一般缺少的方法

1 个答案:

答案 0 :(得分:1)

简短回答

  

JavaScript 是否等同于__getattr__

否:(


长答案

看起来您只想映射别名, JavaScript 在添加属性时没有问题

// set up
function Converter(amount) {
    this.amount = amount;
}
Converter.prototype.rupy = function () {
    return this.amount * 2;
};
// add aliases
var original = 'rupy', aliases = ['rupies'], i;
for (i = 0; i < aliases.length; ++i)
    Converter.prototype[aliases[i]] = Converter.prototype[original];

现在

var foo = new Converter(1);
foo.rupies(); // 2

并且

foo.rupies === foo.rupy; // true

未来的答案

ECMAScript 6(和谐)中,我们有Proxies

Constructor.prototype = Proxy(Constructor.prototype, {
    'get': function (target, name, child) {
            var o = child || target; /* =proxy? if proxy not inherited? */
            if (name in target) return o[name];
            if (name === 'rupies') return o['rupy'];
            return;
        },
    'set': function (target, name, val, child) {
            return target[name] = val;
        },
    'has': function (target, name) {
            return name in target; // do you want to make 'rupies' visible?
        },
    'enumerate': function (target) {
            for (var key in target) yield key;
        }
});