JavaScript getter/setter和扩展对象

Inf*_*igo 6 javascript getter setter extend

我正在研究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);
Run Code Online (Sandbox Code Playgroud)

在Chrome和Firefox中,我得到:

LARGE
MEDIUM
SMALL
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下那里发生了什么吗?为什么在打电话给原来的二传手后,原来的吸气剂也会恢复?

Way*_*ett 5

Underscore的extend样子如下:

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

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

obj['size'] = source['size']
Run Code Online (Sandbox Code Playgroud)

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

要进一步证明这一点,请尝试以下方法:

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

for (var p in test) {
    console.log(p)
}
Run Code Online (Sandbox Code Playgroud)

仅输出:

size
Run Code Online (Sandbox Code Playgroud)

(它不会迭代getter或setter.)

  • 我如何编写一个可以复制getter/setter的扩展方法? (3认同)