类中是不是定义了 GET 或 SET

Posted

技术标签:

【中文标题】类中是不是定义了 GET 或 SET【英文标题】:Is GET or SET defined in class类中是否定义了 GET 或 SET 【发布时间】:2019-01-01 21:42:34 【问题描述】:

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

所以我需要一种可能性来找出这个类是否存在 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 的设置器,它在派生类中评估为真,但在基类中不存在?

【问题讨论】:

【参考方案1】:

试试这个

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

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

More info here

【讨论】:

const descriptor = Object.getOwnPropertyDescriptor(derivatedClass.prototype, prop) if(descriptor !== undefined && typeof descriptor.set == "function") 为我工作!

以上是关于类中是不是定义了 GET 或 SET的主要内容,如果未能解决你的问题,请参考以下文章

c#类中定义public virtual ListItem SelectedItem get; 只能get不可以set,请问有啥方式可以set么?

PHP类中的__set()和__get()方法用在啥地方?可以用例子说明一下么...

java类中的get,set属性的作用

List 类型的get和set函数定义

java类中为啥设置set和get方法操作属性

PHP中的__get()和__set()方法获取设置私有属性