引用属性而不是getter和setter

时间:2013-12-18 11:48:42

标签: javascript

问题:是否可以让object1以某种方式提供object2的属性,不需要getter和setter?所以我可以a = object1.attributeobject1.attribute = a

示例:我正在实现对页面上绝对定位的HTML对象进行动态对齐的支持。应支持各种对齐 - 左,右,上,下,水平中心,垂直中心或均匀间隔。为了减少重复代码的数量,我想出了实现类Direction的解决方案,它可以是水平和垂直的,并且在与Element相关的Facade-ish模式下工作。它作为属性传递给对齐函数。同样地,我正在处理左/右/中间并均匀地分配区别,但是为了保持简单,我们在这里忽略它。

这是班级。

Direction = function(selector) {
    this.selector = selector;
}

Direction.prototype.get = function(element) {
    return parseInt(element.style[this.selector]);
}

Direction.prototype.set = function(element, value) {
    element.style[this.selector] = value + 'px';
}

以下是客户可以使用的“常量”。

Direction.VERTICAL = new Direction('left');
Direction.HORIZONTAL = new Direction('top');

以下是执行“最小”对齐(左侧或顶部)的公共方法。

alignMin = function(elements, direction) {
    var min = Number.MAX_VALUE;
    for (var i = 0; i < elements.length; i++) {
        min = Math.min(min, direction.get(elements[i]));
    }
    for (var i = 0; i < elements.length; i++) {
        direction.set(elements[i], min);
    }
}

此处的客户端演示了预期用途。

alignDivsToLeft = function() {
    alignMin(document.getElementsByTagName("div"), Direction.VERTICAL);
}

JSFiddle上的工作示例:http://jsfiddle.net/7Tpam/

再次提问:这一切都有效,我只是想知道,如果不是Direction.get()Direction.set()方法,我可以做一些事情(对值的引用?)来直接访问“proxined”属性,因此alignMin函数可以只使用

...
min = Math.min(min, direction.value);     // possibly with parseInt()
...

...
direction.value = min;                    // possibly with + 'px'
...

如果有一个简单的解决方案,它将是一种更短,更清晰,更优雅的方式,特别是在具有更多属性(位置,尺寸,......)的情况下。另外还有好奇心的因素(仍在学习JavaScript的魔力,所以......)。

1 个答案:

答案 0 :(得分:1)

某些浏览器中的Javascript支持getters and setters as described in this article

使用您的对象:

Direction = function(selector) {
    this._selector = selector;
}

Direction.prototype = {
    get selector(){
        return this._selector;
    },
    set selector(selector){
        this._selector = selector
    }
}

用法:

var direction = new Direction("left");
console.log(direction.selector); // getter
direction.selector = 'right' //setter

JSFiddle:http://jsfiddle.net/7Tpam/1/

首先,这似乎是您所描述的内容,但要注意它没有全球支持

  

火狐
     Safari 3+(全新)
     Opera 9.5(即将推出)
  来源:上面链接的文章