问一个 es6 class 类中定义属性的问题

2020-03-11 11:54:27 +08:00
 chenstack
class Base {
    model = 'base'

    constructor() {
        console.log(this.model)
    }
}

class Derived extends Base {
    model = 'derived'
}

let obj = new Derived()
console.log(obj.model)

打印结果: base derived

实例化 Derived 的对象时,父类 Base 构造函数中,Derived 里面定义的 model 还没有绑定到 this,所以只能取到'base'。如果想得到'derived'是否只能重写 Derived 的 constructor ?想问或者有没有更优雅的办法。

还有试了一下 es7 的静态属性

class Base {
    static model = 'base'

    constructor() {
        console.log(this.constructor.model)
    }
}

class Derived extends Base {
    static model = 'derived'
}
let obj = new Derived()

打印结果: derived

虽然可以生效,但是不能通过对象实例(this)访问。

2259 次点击
所在节点    JavaScript
8 条回复
onfuns
2020-03-11 12:29:39 +08:00
构造函数加 super
chenstack
2020-03-11 12:35:30 +08:00
@onfuns 加了是一样的结果
class Base {
    model = 'base'

    constructor() {
        console.log(this.model)
    }
}

class Derived extends Base {
    model = 'derived'

    constructor() {
        super()
        console.log(this.model)
    }
}

let obj = new Derived()

我打算在 Base 的 constructor 加上 model 参数,由子类 super('derived')这种方式传递了
chenluo0429
2020-03-11 12:48:22 +08:00
为什么要在 Base 的构造函数里面获取不同的 model 值?是要在基类判断子类类型进行特殊处理?
chenstack
2020-03-11 14:12:38 +08:00
@chenluo0429 想在基类最后做一些操作,例如根据 model 读取不同的配置文件,例子里面的值只是为方便展示
chenluo0429
2020-03-11 14:25:15 +08:00
@chenstack 显然不应该在基类去处理子类的问题。对于基类来说,子类是不可知的。可以在 base 实现一个配置读取的方法,然后在 derived 去 override
Handle
2020-03-12 10:22:51 +08:00
或许不应该在 constructor 里面做?
可以新建一个方法来判断子类
chenstack
2020-03-12 13:01:21 +08:00
@Handle 因为想在 constructor 里面就做读取配置这个操作,新建一个方法在 constructor 调用也是一样的结果,现在我由子类传递这个参数给父类的 constructor 初始化了
chnwillliu
2020-03-14 19:18:25 +08:00
这俩东西都还不是 ES 标准呢,不是你说的 ES6 的内容。这个提案在 stage 3 里躺了一年多了,愣是进不了 stage 4。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/651811

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX