gpt4 book ai didi

javascript - Object.assign(...) 尝试在没有 setter 的情况下设置属性

转载 作者:行者123 更新时间:2023-12-04 03:13:06 25 4
gpt4 key购买 nike

在对象上专门定义一个只读属性,然后尝试在原始对象之上分配另一个对象时,Object.assign 似乎不关心目标属性是否被读取- 仅:

var myObj = {
firstName: "Jimbo",
lastName: "Smythe"
};

Object.defineProperty(myObj, "fullName", {
get: function () {
return this.firstName + " " + this.lastName;
}
});

Object.assign(myObj, {
fullName: "Jimbo T. Smythe"
});

这会导致以下异常:

TypeError: Cannot set property fullName of # which has only a getter

这不是 Object.assign 中的错误吗?

完整示例在这里:https://jsfiddle.net/fa8j7p5j/

最佳答案

所以我认为这里真正的问题是以前的 Object.assign 从来没有像这样可能导致异常的情况。现在是因为存在只读属性。现在没有办法盲目地对两个未知对象使用 assign 因为它可能会爆炸。

不幸的是,在添加新的 Object.assignSafe 方法之前,解决此问题的唯一方法是防止这些不良属性。

/**
* This function performs an Object.assign but does not explode on trying to set a read-only property
* @param {Object} target Target to apply sources properties to
* @param {Array<Object>} sources Any number of sources to be applied to target
* @return {Object} The updated target object;
*/
function assignSafe(target, ...sources) {
const proto = Object.getPrototypeOf(target);
const safe = sources.map(source => {
let entries = Object.entries(source);
let reduced = entries.reduce((accumulator, currentValue) => {
const descriptor = Object.getOwnPropertyDescriptor(proto, currentValue[0]);
if (!descriptor || descriptor.set) {
accumulator.push(currentValue);
}
return accumulator;
}, []);
return Object.fromEntries(reduced);
});
return Object.assign(target, ...safe);
}

关于javascript - Object.assign(...) 尝试在没有 setter 的情况下设置属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43355061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com