所有属性的JavaScript getter

时间:2009-06-15 00:45:23

标签: javascript firefox getter

长话短说:我的情况是我喜欢PHP式的getter,但是在JavaScript中。

我的JavaScript仅在Firefox中运行,因此我可以使用Mozilla特定的JS。

我能找到制作JS getter的唯一方法是需要指定其名称,但我想为所有可能的名称定义一个getter。我不确定这是否可行,但我非常想知道。

8 个答案:

答案 0 :(得分:58)

<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"> </script> <div id="submitted"> <h3>Submitted Ideas</h3> </div> <form id="titleForm"> <h3>Add Idea</h3> <br> <input type="text" name="title" id="title" placeholder="Title" size="38" required /> <br> <textarea name="description" id="description" placeholder="description" cols="29" required oninvalid="this.setCustomValidity('write your message here!')"></textarea> <br> <input type="text" name="category" id="category" placeholder="category" size="38" /> <br> <br> <input type="submit" value="add idea"> </form>可以做到!我很高兴这存在!这里给出了答案:Is there a javascript equivalent of python's __getattr__ method?。用我自己的话来改写:

Proxy

胜利的代理人!查看MDN文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

适用于chrome,firefox和node.js.缺点:在IE中不起作用 - freakin IE。很快。

答案 1 :(得分:48)

你能找到的最接近的是__noSuchMethod__,它相当于PHP的__call()。

不幸的是,没有等效的__get / __ set,这是一种耻辱,因为有了它们我们可以实现__noSuchMethod__,但我还没有看到使用__noSuchMethod __实现属性的方法(如在C#中)。

var foo = {
    __noSuchMethod__ : function(id, args) {
        alert(id);
        alert(args);
    }
};

foo.bar(1, 2);

答案 2 :(得分:24)

如果您使用ES6进行编码,可以将代理和类组合起来,使其具有漂亮的代码,如php

class Magic {
    constructor () {
        return new Proxy(this, this);
    }
    get (target, prop) {
        return this[prop] || 'MAGIC';
    }
}

这会绑定到处理程序,因此您可以使用此而不是目标。

注意:与PHP不同,代理处理所有属性请求。

let magic = new Magic();
magic.foo = 'NOT MAGIC';
console.log(magic.foo); // NOT MAGIC
console.log(magic.bar); // MAGIC

您可以查看哪些浏览器支持代理http://caniuse.com/#feat=proxy和类http://caniuse.com/#feat=es6-class。节点8支持两者。

答案 3 :(得分:5)

Javascript 1.5确实有getter/setter syntactic sugar。 John Resig here

对此进行了很好的解释

它对于网络使用来说不够通用,但Firefox当然也有它们(如果您想在服务器端使用它,也可以使用Rhino)。

答案 4 :(得分:5)

如果你真的需要一个有效的实现,你可以通过测试undefined的第二个参数来“欺骗”你的方式,这也意味着你可以使用get来实际设置参数。

var foo = {
    args: {},

    __noSuchMethod__ : function(id, args) {
        if(args === undefined) {
            return this.args[id] === undefined ? this[id] : this.args[id]
        }

        if(this[id] === undefined) {
            this.args[id] = args;
        } else {
            this[id] = args;
        }
    }
};

答案 5 :(得分:1)

如果您正在寻找类似PHP的__get()函数,我认为Javascript不会提供任何此类构造。

我能想到的最好的事情是遍历对象的非函数成员,然后为每个成员创建相应的“getXYZ()”函数。

在狡猾的伪代码中:

for (o in this) {
    if (this.hasOwnProperty(o)) {
        this['get_' + o] = function() {
            // return this.o -- but you'll need to create a closure to
            // keep the correct reference to "o"
        };
    }
}

答案 6 :(得分:1)

我最终使用了nickfs的答案来构建我自己的解决方案。我的解决方案将自动为所有属性创建get_ {propname}和set_ {propname}函数。它确实在添加之前检查该函数是否已存在。这允许您使用我们自己的实现覆盖默认的get或set方法,而不会有被覆盖的风险。

for (o in this) {
        if (this.hasOwnProperty(o)) {
            var creategetter = (typeof this['get_' + o] !== 'function');
            var createsetter = (typeof this['set_' + o] !== 'function');
            (function () {
                var propname = o;
                if (creategetter) {
                    self['get_' + propname] = function () {
                        return self[propname];
                    };
                }
                if (createsetter) {
                    self['set_' + propname] = function (val) {
                        self[propname] = val;
                    };
                }
            })();
        }
    }

答案 7 :(得分:0)

这并不是对原始问题的确切答案,但是thisthis问题已关闭并在此处重定向,所以我在这里。我希望我能像我一样帮助其他一些落入此处的JS新手。

来自Python,我一直在寻找obj.__getattr__(key)obj.__hasattr__(key)方法的等效方法。我最终使用的是: obj[key]的{​​{1}}和getattrdoc)的obj.hasOwnProperty(key)