【问题标题】:Generating generic getters and setter on javascript object在 javascript 对象上生成通用 getter 和 setter
【发布时间】:2018-01-10 00:41:18
【问题描述】:

可以在 javascript 中创建 getter 和 setter,如下所示

Object.defineProperty
__define***__

在所有这些情况下,属性的名称都是已知的。

是否可以创建一个通用的。

我的意思是,我有一个 getter 或 setter,它的调用与属性名称无关。

这可能吗? 如果有,怎么做?

问候。

注意: 我在发布问题后确实找到了这些。正如第一个答案所述,目前看来这是不可能的。

Is it possible to implement dynamic getters/setters in JavaScript?

Monitor All JavaScript Object Properties (magic getters and setters)

【问题讨论】:

    标签: javascript


    【解决方案1】:

    有一个非标准函数__noSuchMethod__() 在将不存在的属性作为函数调用时执行。

    但我认为 JavaScript 中还没有你正在寻找的东西。

    【讨论】:

    • 谢谢。这也是我意识到的。看起来我必须用旧的函数方式来实现它。
    【解决方案2】:

    致所有像我这样的时间旅行者:

    在提出这个问题的时候这是不可能的,但是在当前版本的 EcmaScript 中已经可以通过所谓的代理对象实现。在这里查看更多:

    【讨论】:

      【解决方案3】:

      目前在标准 javascript 中是不可能的。

      【讨论】:

        【解决方案4】:

        我想你应该自己处理这个:

        if (!object.hasOwnProperty('foo')) {
          // object has a foo property, its value might be undefined
        
        } else if (typeof object.foo != 'undefined') {
          // there is a foo property elsewhere on object's prototye chain with 
          // a value other than undefined
        
        } else {
          // the foo property might exist on the prototype chain with
          // a value of undefined, or might not exist on the chain at all
        }
        

        【讨论】:

        • 我并没有真正关注。如果我调用 obj.foo 并且未定义 foo,将如何调用代码?我的意思是一个完整的工作示例将不胜感激。
        • 我的意思是其他人已经说过“你不能那样做”,所以我只是补充一点,你应该在调用 obj.foo 之前检查它是否存在。以上是如何做到这一点的工作代码,但它不会告诉你foo 是否可调用。关于如何确定是否可以在 comp.lang.javascript 上的 is Function 线程上调用某些内容的讨论。
        • 好的。我想要做的是实际捕获对丢失属性的调用并报告它们。作为我正在从事的项目的一部分,它是必需的。因此,我实际上并不知道将调用哪些属性。
        【解决方案5】:

        我觉得你们正在寻找这样的东西

        function getterSetter()
        {
        var valA;
        this.set=function (propName,val)
        {
        if(typeof this[propName] =='function' )
        {
        return false;
        }
        this[propName]=val;
        }
        this.get=function (propName,val)
        {
        if(typeof this[propName] =='function' )
        {
        return false;
        }
        return this[propName];
        }
        }
        

        这里的 set 和 get 方法是 setter 和 getter。您可以使用以下代码验证这一点。

        var testObj=new getterSetter();
        testObj.set('valA',10);
        alert(testObj.get('valA'));
        

        此外,检查要设置/获取的 propName 不是函数。

        【讨论】:

        • 这个想法是能够知道何时发出对不存在的属性或方法的请求并执行一些自定义函数 - 很像动态在 c# 中的工作方式。
        猜你喜欢
        • 2022-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-01
        相关资源
        最近更新 更多