是否可以为对象分配值以触发操作/方法?

时间:2016-07-26 04:29:15

标签: javascript

示例:

location = "http://www.mozilla.org";

您将字符串分配给a Location object以导航到新页面。

是否可以使用普通的Javascript对象完成?

首先想到的方法是setter,但它需要将属性名称指定为Object.property。

第二种方法可能是赋值重载,但在Javascript中似乎没有。

4 个答案:

答案 0 :(得分:1)

你可以使用 Object.watch()财产。
但是因为它不是所有浏览器都支持你需要一个 Polyfill要添加到您的文件中 除了这些现成函数之外,您还可以使用setTimeout()或window.requestAnimationFrame()编写自己的函数,您可以在连续线程中检查函数的特定属性。

示例:

    var threadCheck = requestAnimationFrame ||
    webkitRequestAnimationFrame ||
    mozRequestAnimationFrame ||
    oRequestAnimationFrame ||
    msRequestAnimationFrame ||
    function(callback) {
        setTimeout(callback, 16);
    },

    oldProperty = {},

    watchFunction = function (obj, objProp) {
    var len = objProp.length,
        prop,
        i;
    for (i= 0; i < len; i++) {
        prop = objProp[i];
        oldProperty[prop] = obj[prop];
    }
    checkFunction();
},

checkFunction = function () {
    var prop;
    for (prop in oldProperty) {
        if (oldProperty[prop] !== obj[prop]) {
            executeFunction();
            oldProperty[prop] = obj[prop];
        }
    }
    threadCheck(checkFunction);
},

executeFunction = function () {
    console.log('changed')
},

obj = {
    propertyA : function() {},
    propertyB : 'check',
    propertyC : {
        dummy : 'xyz'
    },
    propertyD : 999
};

watchFunction(obj, ['propertyA', 'propertyB', 'propertyC', 'propertyD']);

结果(在chrome浏览器的控制台中运行给定的代码,它只是一个原型,有很多改进的范围。还必须实现unwatch()函数):

obj.propertyA = function(){}
(){}
VM1016:35 changed
obj.propertyB = 'check'
"check"
obj.propertyB = 'check1'
"check1"
VM1016:35 changed
obj.propertyB = 'check1'
"check1"
obj.propertyB = 'check2'
"check2"
VM1016:35 changed
obj.propertyA = 'check2'
"check2"
VM1016:35 changed
obj.propertyA = function(){}
(){}
VM1016:35 changed
obj.propertyD = 999
999
obj.propertyD = 99
99
VM1016:35 changed
obj.propertyD = 991
991
VM1016:35 changed

答案 1 :(得分:1)

是的,通过定义属性。

var test = function (msg) {
    alert(msg);
};

var d = Date.prototype;
Object.defineProperty(d, "year", {
    get: function () { return this.getFullYear() },
    set: function (y) { test(y); }
});

d.year = 2016;

Object.defineProperty(Window.prototype, "foo", {
    get: function () { return 'hi' },
    set: function (y) { alert('hi' + y); }
});

foo = 2016; 

Stackoverflow - Javascript getters and setters for dummies?

Mozilla - Working with objects

Mozilla - Object.defineProperty()

答案 2 :(得分:0)

不,无法为对象分配内容并自动触发JavaScript中的操作方法。 “location”实际上是window对象的属性。 location属性的getter返回一个具有“href”的对象“Location”以及一些其他属性和方法。 location属性的setter接受一个字符串,并在内部将其设置为“Location”对象的“href”属性。你可以自己使用JavaScript getter和setter来实现这样的东西。请参阅此参考:http://javascriptplayground.com/blog/2013/12/es5-getters-setters/。 希望这是有道理的。

答案 3 :(得分:0)

是。 ES5引入了setter和getter的概念,以缩小API之间的差距,例如window.locationelement.innerHTML以及您可以在javascript中执行的操作。

可以直接在对象文字中定义Setter和getter:

var myobj = {
  set foo (str) {
    // execute a function
  },
  get foo () {
    // execute a function
  }
}

请注意语法 - 在关键字:set之后没有get,以区别于常规键"set""get"

根据上述声明,执行以下任一操作:

myobj.foo = somevalue;

或     somevar = myobj.foo;

会触发相应的setget功能。

或者,如果您已有对象,则可以使用Object. defineProperty()添加具有setter和getter的属性:

Object.defineProperty(myobj, "bar", {
    get: function () {
      // execute a function
    },
    set: function (y) {
      // execute a function
    }
});

现在执行myobj.bar = x会调用bar的setter函数。

有关详细信息,请参阅以下内容:

https://developer.mozilla.org/my/docs/Web/JavaScript/Reference/Functions/set

https://developer.mozilla.org/my/docs/Web/JavaScript/Reference/Functions/get