JavaScript getter/setter和扩展对象
我正在研究JavaScript中的getter和setter,以及它们与扩展对象的扩展函数(如jQuery的$.extend和下划线的u.extend)的配合情况。代码设置如下所示: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
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”。Doconsole.log(这个大小)代码>最后看看你得到了什么..@JCOC611-我不这么认为。请参阅我的答案以获得解释。我将如何编写一个复制getter/setter的扩展方法?