JavaScript getter/setter和扩展对象

JavaScript getter/setter和扩展对象,javascript,extend,setter,getter,Javascript,Extend,Setter,Getter,我正在研究JavaScript中的getter和setter,以及它们与扩展对象的扩展函数(如jQuery的$.extend和下划线的u.extend)的配合情况。代码设置如下所示: var test = { get size() { return this._size; }, set size(val) { this._size = val; }, } test.size = "LARGE"; console.log(test.size); //$.extend(te

我正在研究JavaScript中的getter和setter,以及它们与扩展对象的扩展函数(如jQuery的$.extend和下划线的u.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也会被还原?

下划线的
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和getter,最后它只是将属性
size
设置为“SMALL”。Do
console.log(这个大小)最后看看你得到了什么..@JCOC611-我不这么认为。请参阅我的答案以获得解释。我将如何编写一个复制getter/setter的扩展方法?