gpt4 book ai didi

设置前的 Javascript setter 覆盖值

转载 作者:搜寻专家 更新时间:2023-11-01 05:28:46 24 4
gpt4 key购买 nike

我本质上想做的是:

Blog.prototype = {
set content(content) {
this.content = JSON.parse(content);
}
}

但是,这会导致无限递归。

我知道我可以做类似的事情:

  set content(content) {
this._content = JSON.parse(content);
},

get content() {
return this._content;
}

但是,当我执行 JSON.stringify(blog) 时,它不包括 content,但包括 _content,这是不希望的.

我该怎么做呢?

最佳答案

使“_content”变量不可枚举。

Blog.prototype = {
set content(newContent) {
Object.defineProperty(this, "_content", {
value: JSON.parse(newContent),
writable: true
});
},
get content() {
return this._content;
}
};

默认情况下,如果未在对 defineProperty() 的调用中明确提供,则对象属性的“可枚举”标志为 false

总有一天 Symbol 类型将得到普遍支持,这将是一个更好的选择,因为您可以通过这种方式制作一个有保证的唯一属性键。如果您不需要 IE 支持并且可以使用 Symbols:

Blog.prototype = () => {
const internalContent = Symbol("content key");
return {
set content(newContent) {
this[internalContent] = newContent;
},
get content() {
return this[internalContent];
}
};
}();

JSON.stringify() 会忽略符号键控属性,因此您不必为 defineProperty() 而烦恼。 Symbol 方法的好处是您不必担心冲突。从 Symbol() 返回的每个 Symbol 实例都是不同的。

关于设置前的 Javascript setter 覆盖值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41090600/

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