gpt4 book ai didi

javascript - 类中是否定义了 GET 或 SET

转载 作者:行者123 更新时间:2023-11-29 23:09:53 28 4
gpt4 key购买 nike

我试图找出当前派生类是否有属性 setter 。原因是我通过扩展类的构造函数循环了几个选项。并且只想分配属于此类而不是基类的那些属性。

所以我需要一个可能性来找出这个类是否存在 getter 或 setter。我删除了尽可能多的代码以仅展示问题。

这是基类:

class baseClass{
constructor(wOptions){
//do some stuff
if(typeof wOptions == "object"){
for(let prop in wOptions){
// if(Object.getOwnPropertyDescriptor(this, prop) != undefined){
// if(this.hasOwnProperty(prop) != undefined){ /* doesn't work either */
if(typeof this[prop] != "undefined"){ /* calls the getter, if exists. */
this[prop] = wOptions[prop];
delete wOptions[prop];
}
}
}
}
get mainProperty(){
return 42;
}
set mainProperty(newValue){
return 42;
}
}

这是派生类:

class derivatedClass extends baseClass{
constructor(wOptions){
super(wOptions)
//do some other stuff
let html = document.body;
Object.defineProperty(this, "html", {value: html, writable: false});

if(typeof wOptions == "object"){
for(let prop in wOptions){
// if(Object.getOwnPropertyDescriptor(this, prop) != undefined){
// if(this.hasOwnProperty(prop) != undefined){ /* doesn't work either */
if(typeof this[prop] != "undefined"){ /* calls the getter, if exists. */
this[prop] = wOptions[prop];
delete wOptions[prop];
}
}
}
}
get otherProperty(){
return html.innerText;
}
set otherProperty(newValue){
return html.innerText = newValue;
}
}

以及如何初始化对象:

let options = {otherProperty: "new Text"};
let object = new derivatedClass(options);
console.log(options);

关于已经尝试过的解决方案:

  • getOwnPropertyDescriptor 总是返回 undefined;返回指定的选项
  • hasOwnProperty 总是返回 false ;返回指定的选项
  • typeof this[prop] != "undefined" 调用 getter,这可能非常糟糕,因为 html 尚未定义。 html.innerText
  • 的引用错误
  • 不是解决方案,但用于验证:删除派生类中的 if 子句,将正文更改为 new Text 并在控制台中打印一个空对象。

在 Chrome 71 中测试。

有一些选择可以避免这种情况:

  • 将此类处理的所有属性转移到另一个对象(非常丑陋并且很可能忘记列表中的属性)
  • 始终使用 Object.defineProperty,因为它们将在 super 调用之后执行。但是,它不如类构造的 get/set 函数漂亮。

是否有可能找出是否有可用于 otherProperty 的 setter,它在 derivatedClass 中评估为 true 但在 baseClass 中不评估?

最佳答案

试试这个

const descriptor = Object.getOwnPropertyDescriptor(derivatedClass.prototype, 'otherProperty');
console.log(descriptor);

如果 derivatedClass.prototype 有一个 otherProperty(否则返回 undefined),它将返回一个包含一些值的对象。在返回的对象中,您应该看到 getset

More info here

关于javascript - 类中是否定义了 GET 或 SET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53999173/

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