这不是一个基本问题。:-)
从ES5开始,可以通过(and ) 使用setter和getter定义属性。ES5 的这一特性在现代浏览器中得到了相当广泛的支持,但较旧的浏览器(例如 IE8 和更早版本)没有。Object.defineProperty
Object.defineProperties
使用吸气剂,可以做到这一点:
var optvar=true;
rect = new Kinetic.Rect({
x: 22,
y: 7,
width: 0,
height: 0,
fill: 'red',
stroke: 'black',
strokeWidth: 4
});
Object.defineProperty(rect, "draggable", {
enumerable: true,
get: function() {
return optvar;
}
});
这会在其上创建一个属性rect
,检索时会返回 的当前值optvar
。它之所以有效,是因为 getter 函数是对optvar
变量的闭包(关于闭包的更多信息,请参见我的博客:闭包并不复杂。)
当然,这是否正常工作Kinetic.Rect
将取决于如何Kinetic.Rect
实现。
上面创建的属性是可枚举的[像其他人一样显示在for..in
循环中],但不可写。如果你希望它是可写的:
Object.defineProperty(rect, "draggable", {
enumerable: true,
get: function() {
return optvar;
},
writable: true,
set: function(value) {
optvar = value;
}
});
根据您对问题的评论:
我有多个对象rect
(都是动态创建的)。我希望所有对象的属性都链接到一个变量。
上面的机制可以用来做到这一点,因为当然,你可以为你的所有 rect 设置 getter:
var optvar = true;
var rect;
var rects = [];
while (rects.length < 10) {
rect = new Kinetic.Rect({
x: 22,
y: 7,
width: 0,
height: 0,
fill: 'red',
stroke: 'black',
strokeWidth: 4
});
Object.defineProperty(rect, "draggable", {
enumerable: true,
get: getDraggable
});
rects.push(rect);
}
function getDraggable() {
return optvar;
}
现在,所有 10 个矩形都将是可拖动的,或者不是,基于optvar
.
(注意:我假设所有这些代码都在某个函数中,所以我们没有创建全局变量。)