引用属性而不是 getter 和 setter
Reference to an attribute instead of getters and setters
问题:是否有可能让对象 1 以某种方式提供 object2 的属性,不需要 getter 和 setter?所以我可以做a = object1.attribute
和object1.attribute = a
.
示例:我正在实现对页面上绝对定位的HTML对象的动态对齐的支持。应支持各种对齐方式 - 左,右,顶部,底部,水平中心,垂直中心甚至均匀间隔。为了减少重复代码的数量,我想出了实现类Direction
的解决方案,它可以是水平的和垂直的,并且在Element
方面以外观模式工作。它作为属性传递给对齐函数。同样,我正在处理左/右/中间并均匀分布区分,但为了简单起见,让我们在这里忽略它。
这是课程。
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()
方法,所以alignMin
函数可以使用
...
min = Math.min(min, direction.value); // possibly with parseInt()
...
和
...
direction.value = min; // possibly with + 'px'
...
如果有一个简单的解决方案,那将是一种更短、更清晰、更优雅的方式,尤其是在具有更多属性(位置、尺寸等)的情况下。此外,还有好奇心的因素(仍在学习JavaScript的魔力,所以..)。
某些浏览器中的 Javascript 支持本文中所述的 getter 和 setter。
使用对象:
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/
这似乎是您首先描述的内容,但请注意,它没有全局支持
火狐
野生动物园 3+ (全新)
Opera 9.5 (即将推出)
来源:上文链接文章
- "实例范围”;TypeScript类的getter/setter
- 如何防止在javascript中执行继承属性的getter-setter方法
- 传递参数时如何避免模块模式中的 getter/setter 函数
- 使用特权Getter/Setter函数的JavaScript原型函数
- 使用框架/语言中的getter/setter,或者定义自己的显式getter/setters
- CoffeeScript:对象初始化程序中的Getter/Setter
- 对象描述符getter/setter在最近的Chrome/V8版本中的性能
- 这个 getter-setter 闭包是否有充分的理由以这种方式在其内部对象中声明它是私有的
- ES6 getter setter with JSON object
- 如何获取控制台.log输出 getter 结果而不是字符串“[Getter/Setter]”
- 使用 getter/setter 覆盖 javascript 属性,同时仍访问底层属性
- 访问 JavaScript 对象的默认 getter/setter
- 任何重写参数的方法'getter/setter性质
- Angular 1.3 getter setter ng-model
- 将getter/setter添加到原型中
- Getter/Setter或直接引用
- Node.js Sequelize getter/setter RangeError
- 我能告诉通用getter/setter在其主体中应用了什么属性吗
- 对象getter/setter与新构造函数的比较-测试结果
- 将JavaScript getter/setter添加到本机不可配置的属性中