A getter是用于返回属性值的属性的访问器函数。这是一个getter对象的样子:
var obj = {
get example() {
console.log("getter was called");
return Math.floor(Math.random() * 100);
}
};
console.log(obj.example);
// Note no() ---------^
注意,当我们读到example
属性的值,函数获取运行,即使它看起来并不像一个函数呼叫。
MDN文档的那部分内容是,Object.assign
将调用该getter,它不会在目标对象上创建一个等效的getter。所以:
var obj = {
get example() {
console.log("getter was called");
return Math.floor(Math.random() * 100);
}
};
var obj2 = Object.assign({}, obj); // calls getter
console.log(obj2.example); // just has a simple value
console.log(obj2.example); // same value, no call
console.log(obj2.example); // same value, no call
obj
的example
酒店有一个getter,但obj2
的example
属性只是一个简单的价值属性。 Object.assign
没有复制吸气剂,它只是抓住吸气剂的当前值并将其分配给obj2.example
。
您可以副本干将,只是不能与Object.assign
:
function copyProperties(target, source) {
Object.getOwnPropertyNames(source).forEach(name => {
Object.defineProperty(
target,
name,
Object.getOwnPropertyDescriptor(source, name)
);
});
return target;
}
var obj = {
get example() {
console.log("getter was called");
return Math.floor(Math.random() * 100);
}
};
var obj2 = copyProperties({}, obj); // calls getter
console.log(obj2.example); // calls getter
console.log(obj2.example); // calls getter
console.log(obj2.example); // calls getter
当然,如果吸气不是设计对象之间进行复制(例如,如果example
的明确使用obj
),你可能会得到意想不到的结果。
这非常有道理,谢谢。但是如果我为'source'对象添加了特定的非枚举属性,并且我正在使用'getOwnPropertyNames'的最后一个示例呢?即使那些我们使用这种方法来获得不可枚举的getter和setter,它也会拿起其他任何非枚举类型(比如'length',如果它是一个数组对象的话)。所以我必须在自定义'copyProperties'方法中手动排除它们,是的? – qarthandso
@qarthandso:我刚刚几乎随意使用了'getOwnPropertyNames',想知道是否有人想复制getter和setter等,他们可能也想复制非枚举属性。 (按照这个逻辑,我可能应该也包含'getOwnPropertySymbols';但它只是一个小例子。)如果你想复制属性,但坚持可枚举的属性,使用'Object.keys',它只给你自己的,可枚举属性。 –