【问题标题】:JavaScript getters/setters and extending objectsJavaScript getter/setter 和扩展对象
【发布时间】:2011-03-26 23:43:28
【问题描述】:

我正在研究 JavaScript 中的 getter 和 setter,以及它们如何与扩展对象的扩展函数配合使用,例如 jQuery 的 $.extend 和 Underscore 的 _.extend。代码设置如下:

var test = {
    get size() { return this._size; },
    set size(val) { this._size = val; },
}   

test.size = "LARGE";
console.log(test.size);

//$.extend(test, { get size() { return "MEDIUM"; } });
_.extend(test, { get size() { return "MEDIUM"; } });

console.log(test.size);
test.size = "SMALL";
console.log(test.size);

在 Chrome 和 Firefox 中我得到:

LARGE
MEDIUM
SMALL

谁能解释一下那里发生了什么?为什么调用原来的setter后,原来的getter也恢复了?

【问题讨论】:

  • 我认为 getter 替换了原始的 setter 和 getter,最后它只是将属性 size 设置为“SMALL”。最后做console.log(this._size);,看看你会得到什么..
  • @JCOC611 - 我不这么认为。请参阅我的答案以获得解释。

标签: javascript extend setter getter


【解决方案1】:

下划线的extend 看起来像这样:

 _.extend = function(obj) {
   each(slice.call(arguments, 1), function(source) {
     for (var prop in source) obj[prop] = source[prop];
   });
   return obj;
 };

它迭代源对象的属性,将它们添加到目标对象,然后返回目标对象。当它将size 属性复制到您要扩展的对象时,它基本上是这样做的:

obj['size'] = source['size']

也就是说,它使用新对象的 getter,但只复制该 getter 返回的值。它不会传输 getter 本身。

要进一步证明这一点,请尝试以下操作:

var test = {
    get size() { return this._size; },
    set size(val) { this._size = val; },
}   

for (var p in test) {
    console.log(p)
}

仅输出:

size

(它不会迭代 getter 或 setter。)

【讨论】:

  • 我将如何编写一个可以复制 getter / setter 的扩展方法?
猜你喜欢
  • 1970-01-01
  • 2019-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多