class 中是否定义了 GET 或 SET
Is GET or SET defined in class
我试着找出,如果当前导出的class有一个属性 setter。原因是我通过扩展 classes 的构造函数循环了几个选项。并且只想分配那些属性,它们是 class 的一部分,而不是基础 class。
所以我需要一个可能性来查明,对于这个 class 是否存在 getter 或 setter。我删除了尽可能多的代码以仅展示问题。
这是基础class:
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:
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
总是returnsundefined
; returns options
分配
hasOwnProperty
总是 returns false
; returns options
分配
typeof this[prop] != "undefined"
调用 getter 这可能会很糟糕,因为 html 还没有定义。 html.innerText
的引用错误
- 不是解决方案,但用于验证:删除派生的 class 中的
if
子句,将正文更改为 new Text
并在控制台中打印一个空对象。
在 Chrome 71 中测试。
有一些选择可以避免这种情况:
- 将此 class 处理的所有属性转移到另一个对象(非常丑陋,很可能会忘记列表中的 属性)
- 始终使用
Object.defineProperty
,因为它们将在super
调用之后执行。但是,它并不比 class 构造的 get/set 函数漂亮。
是否有可能查明是否存在 otherProperty
可用的 setter,它在派生类中的计算结果为真,但在基类中的计算结果为真?
试试这个
const descriptor = Object.getOwnPropertyDescriptor(derivatedClass.prototype, 'otherProperty');
console.log(descriptor);
如果derivatedClass.prototype
有一个otherProperty
(否则returns undefined
),它将return一个包含一些值的对象。在 returned 对象中,您应该看到 get
和 set
我试着找出,如果当前导出的class有一个属性 setter。原因是我通过扩展 classes 的构造函数循环了几个选项。并且只想分配那些属性,它们是 class 的一部分,而不是基础 class。
所以我需要一个可能性来查明,对于这个 class 是否存在 getter 或 setter。我删除了尽可能多的代码以仅展示问题。
这是基础class:
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:
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
总是returnsundefined
; returnsoptions
分配hasOwnProperty
总是 returnsfalse
; returnsoptions
分配typeof this[prop] != "undefined"
调用 getter 这可能会很糟糕,因为 html 还没有定义。html.innerText
的引用错误
- 不是解决方案,但用于验证:删除派生的 class 中的
if
子句,将正文更改为new Text
并在控制台中打印一个空对象。
在 Chrome 71 中测试。
有一些选择可以避免这种情况:
- 将此 class 处理的所有属性转移到另一个对象(非常丑陋,很可能会忘记列表中的 属性)
- 始终使用
Object.defineProperty
,因为它们将在super
调用之后执行。但是,它并不比 class 构造的 get/set 函数漂亮。
是否有可能查明是否存在 otherProperty
可用的 setter,它在派生类中的计算结果为真,但在基类中的计算结果为真?
试试这个
const descriptor = Object.getOwnPropertyDescriptor(derivatedClass.prototype, 'otherProperty');
console.log(descriptor);
如果derivatedClass.prototype
有一个otherProperty
(否则returns undefined
),它将return一个包含一些值的对象。在 returned 对象中,您应该看到 get
和 set