示例:
location = "http://www.mozilla.org";
您将字符串分配给a Location object以导航到新页面。
是否可以使用普通的Javascript对象完成?
首先想到的方法是setter
,但它需要将属性名称指定为Object.property。
第二种方法可能是赋值重载,但在Javascript中似乎没有。
答案 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?
答案 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.location
和element.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;
会触发相应的set
和get
功能。
或者,如果您已有对象,则可以使用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