Skip to content
\n
    \n
  1. 目前的方法存在哪些缺点?
  2. \n
\n
object Parent {\n    name :string = 'parent'\n    echoMyName(){\n        console.log(`my name is:${this.name}`)\n    }\n}\n\nobject Child extends Parent{\n    age : number = 20\n    echoMyInfo(){\n        super.echoMyName()\n        console.log(`age:${this.age}`)\n    }\n}\n\nParent.echoMyName()\nChild.echoMyInfo()\n
\n

灵感

\n

下面是这个提案的灵感说明。

\n

我在程序开发中经常使用静态方法,相比于普通函数,静态方法有更好的静态提示和模块区分功能。

\n

但是我遇到了一个问题,就是静态方法不能被继承和覆盖,这是我所熟悉的语言中统一的设计规范。

\n

但是这在开发过程中确实带来了一些不便,国内有个网站叫知乎

\n

为什么java中不用静态方法?
\n静态方法为何不能被覆盖?
\n如果kotlin中class和object关键字的功能结合起来会怎么样?

\n

讨论,这个话题引起了广泛的讨论,有人认为使用静态语法对于OOP来说不够,也有人认为这种方式确实给开发带来了足够的效率提升,提高了开发体验。

\n

很多人和我遇到过同样的问题,就是使用静态开发时,需要抽象父类,而方法复用时,无法覆盖static,降低了开发效率。

\n

但由于static的特殊逻辑,支持静态方法的覆盖似乎不太合适。

\n

那么能不能支持new一个关键字object来实现这个功能呢?

\n

对象具备类的功能,可以被类集成,可以被对象继承,也可以直接使用。

\n

关于OOP,在Java和Kotlin中都有非常多的实际应用,这里请允许我以Java为例来说明。在Java Web开发中,Spring框架是不可或缺的一个框架。 Spring 管理的对象实例都是单例的,也就是一个类只会有一个实例,大多数情况下都是这样的。但是这种情况下,我们需要先声明一个类,然后实例化这个类才能得到对象,这个过程有点繁琐,我们完全可以将这两步合并为一步,即声明一个带类型提示的对象,然后就可以立即使用了。

\n

在 kotlin 中,有 object 关键字语法。以下代码在kotlin中可以运行

\n
object ParentObject {\n    var name = \"ParentObject\"\n\n    fun echoName() = \"name:${name}\"\n}\n\n// Use\nfun main() {\n    println(ParentObject.echoName()) // Output: ParentObject\n}\n
\n

而且kotlin的object支持从class继承,但不支持从object继承,这还是不能解决我一开始遇到的问题

\n

所以想问一下这个功能在js/ts中能不能支持

\n

期待您的回复,非常感谢

","upvoteCount":1,"answerCount":1,"acceptedAnswer":{"@type":"Answer","text":"

你可以试试

\n
const parent = { f() { console.log(this.name) }, name: 'parent' }\nconst child = { __proto__: parent, f() { super.f(); console.log('from child') }, name: 'child' }\nchild.f()
","upvoteCount":1,"url":"https://github.com/orgs/JSCIG/discussions/71#discussioncomment-11144124"}}}

【提案】支持类似kotlin的object关键词,用来解决静态方法无法被继承后重写的问题 #71

Answered by Jack-Works
alamhubb asked this question in Ideas
Discussion options

You must be logged in to vote

你可以试试

const parent = { f() { console.log(this.name) }, name: 'parent' }
const child = { __proto__: parent, f() { super.f(); console.log('from child') }, name: 'child' }
child.f()

Replies: 1 comment 2 replies

Comment options

You must be logged in to vote
2 replies
@alamhubb
Comment options

@ljharb
Comment options

Answer selected by hax
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Category
Ideas
Labels
None yet
3 participants