【问题标题】:How to call a child static function from parent in javascript?如何在javascript中从父级调用子静态函数?
【发布时间】:2022-01-13 14:38:22
【问题描述】:

也许我正在寻找的东西是不可能的,但它对我的需求来说非常方便

class Music extends Database {
    static ref(id){return `musics/${id}`}
}

class Book extends Database {
    static ref(id){return `books/${id}`}
}

class Database {
    static fetch(id){
        const data = request(Database.children.ref(id)) // <===== HERE of course the 'children' function doesn't exists 
        return new this(data)
    }
}

Music.fetch(‘1234’) 

Book.fetch(‘9876’)

如何从父级中的静态fetch 函数调用静态ref 函数?

这将避免在所有子类中复制 'fetch' 函数

如果这是一个反模式解决方案,我该怎么办?

【问题讨论】:

    标签: javascript class inheritance static children


    【解决方案1】:

    关系是相反的:children可以引用他们的parent

    您可以在父级 (Database) 中拥有一个通用静态方法,子级只需使用适当的数据调用该方法:

    class Database {
        static fetch(data, type){
            console.log(`requesting data: ${data} for type: ${type}`);
        }
    }
    
    class Music extends Database {
        static fetch(id){ return super.fetch(`musics/${id}`, "Music"); }
    }
    
    class Book extends Database {
        static fetch(id){ return super.fetch(`musics/${id}`, "Book"); }
    }
    
    
    Music.fetch('1234')
    Book.fetch('9876')

    或者,父级仍然可以访问来自this 的数据,因此您可以使用它来访问子级:

    class Database {
        static fetch(data){
            console.log(`requesting data: ${data} for type: ${this.myType}`);
        }
    }
    
    class Music extends Database {
        static myType = "Music";
        static fetch(id){ return super.fetch(`musics/${id}`); }
    }
    
    class Book extends Database {
        static myType = "Book";
        static fetch(id){ return super.fetch(`musics/${id}`); }
    }
    
    
    Music.fetch('1234')
    Book.fetch('9876')

    您的代码可以使用this完成

    class Database {
        static fetch(id){
            console.log(`requesting data: ${this.ref(id)}`);
        }
    }
    
    class Music extends Database {
        static ref(id){return `musics/${id}`}
    }
    
    class Book extends Database {
        static ref(id){return `books/${id}`}
    }
    
    
    Music.fetch('1234')
    Book.fetch('9876')

    但是,我建议不要这样做。它将继承类的所有责任都放在相同的工作上,而不是将所有逻辑放在父类中,而继承类只做必要的最少工作。

    【讨论】:

    • 哦,是的,this.ref() 有效!
    • 同样,如果我想返回子实例 return new ChildClass(data) ,总是从 fetch 函数返回?有可能吗?
    • return new this.constructor()
    • Argg 快完成了:当我传递这样的参数new this.constructor({name:'myname'}) 时,它会引发错误(SyntaxError: Unexpected identifier)。你知道为什么吗?
    • 对不起,我错了,只是new this()see example here
    猜你喜欢
    • 1970-01-01
    • 2011-10-04
    • 1970-01-01
    • 2013-10-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    相关资源
    最近更新 更多