我试图找出当前派生类是否有属性设置器。原因是我通过扩展类的构造函数循环了几个选项。只想分配这些属性,这些属性是这个类的一部分,而不是基类。
所以我需要找出一个可能性,如果这个类是否存在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
;按照分配的方式返回options
hasOwnProperty
总是返回false
;按照分配的方式返回options
typeof this[prop] != "undefined"
调用getter,这可能非常糟糕,因为html尚未定义。html.innerText
参考误差if
子句,将正文文本更改为new Text
,并在控制台中打印一个空对象。在Chrome 71中测试。
会有一些避免这种情况的办法:
Object.defineProperty
,因为它们将在super
调用之后执行。但是,它没有类构造的get/set函数那么漂亮。是否有可能查明是否有一个在otherProperty
中可用的setter在derivatedClass中计算为true,而在baseClass中没有?
发布于 2019-01-01 22:18:40
试试这个
const descriptor = Object.getOwnPropertyDescriptor(derivatedClass.prototype, 'otherProperty');
console.log(descriptor);
如果derivatedClass.prototype
有一个otherProperty
(否则返回undefined
),它将返回一个包含一些值的对象。在返回的对象中,您应该看到get
和set
https://stackoverflow.com/questions/53999173
复制相似问题