这不是一个基本问题。 :-)
As of ES5 http://www.ecma-international.org/ecma-262/5.1/,可以用以下方式定义属性setters and getters via Object.defineProperty http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.3.6 (and Object.defineProperties
)。 ES5 的这一功能在现代浏览器中得到了相当广泛的支持,但较旧的浏览器(例如 IE8 及更早版本)没有它。
使用吸气剂,可以做到这一点:
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
变量(更多关于我的博客中的闭包:闭包并不复杂 http://blog.niftysnippets.org/2008/02/closures-are-not-complicated.html.)
当然,这是否可以正常工作Kinetic.Rect
将取决于如何Kinetic.Rect
已实施。
上面创建的属性是可枚举的[显示在for..in
像其他循环一样],但不可写。如果你希望它可写:
Object.defineProperty(rect, "draggable", {
enumerable: true,
get: function() {
return optvar;
},
writable: true,
set: function(value) {
optvar = value;
}
});
从您对问题的评论来看:
我有多个对象rect
(全部动态创建)。我希望所有对象的属性都链接到一个变量。
上面的机制可以用来做到这一点,因为当然,你可以为所有的矩形设置吸气剂:
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
.
(注意:我假设所有这些代码都在某个函数中,因此我们不会创建全局变量。)