【问题标题】:Calling a function on assignment in JavaScript在 JavaScript 中调用赋值函数
【发布时间】:2014-06-01 22:38:53
【问题描述】:

我很确定这是不可能的,但也许有聪明人知道是否有机会完成这项工作。是否有可能有代码:

1    myPerson = new Person();
2    myPerson.name = 'Charles Xavier';

第 2 行的代码自动检查 myPerson.setName 是否存在,如果存在则调用

myPerson.setName('Charles Xavier');

代替直接分配。

【问题讨论】:

  • 创建一个帮你检查的辅助函数?或者你为什么不在setName()里面做检查?

标签: javascript function variable-assignment


【解决方案1】:

不,对不起!不过,在 ES6 中是可能的:

var o = {};
Object.defineProperty(o, "name", {
  set: function (value) {
    console.log("Property 'name' set to: " + value);
    // store 'value' somewhere
  }
});

参考https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

相关:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

由于这在 ES6 中是不可能的,像 AngularJS 这样的框架使用脏检查(也就是他们每秒检查 X 次值)来观察属性变化。

【讨论】:

  • 脏检查听起来很糟糕!不过,ES6 附带了这种类型的功能非常酷。
  • @Kirk haha​​ 听起来确实很糟糕,但对于 AngularJS 来说效果很好。
【解决方案2】:

不适用于所有浏览器,但 javascript proxy 仅适用于 firefox,并使其变得无用。 :D

var Validator = {
    set: function(obj, prop, value){
        if(prop == 'name' && setName in obj)
            obj.setName(value);

        obj[prop] = value;
    }
}

var myPerson = new Proxy(Person, Validator);
myPerson.name = 'Charles Xavier'; // This will call Validator.set

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-21
    • 2011-01-20
    • 2013-11-27
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    相关资源
    最近更新 更多