V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
chenstack
V2EX  ›  JavaScript

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

  •  
  •   chenstack · 2020-03-11 11:54:27 +08:00 · 2413 次点击
    这是一个创建于 1700 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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)访问。

    8 条回复    2020-03-14 19:18:25 +08:00
    onfuns
        1
    onfuns  
       2020-03-11 12:29:39 +08:00
    构造函数加 super
    chenstack
        2
    chenstack  
    OP
       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
        3
    chenluo0429  
       2020-03-11 12:48:22 +08:00
    为什么要在 Base 的构造函数里面获取不同的 model 值?是要在基类判断子类类型进行特殊处理?
    chenstack
        4
    chenstack  
    OP
       2020-03-11 14:12:38 +08:00
    @chenluo0429 想在基类最后做一些操作,例如根据 model 读取不同的配置文件,例子里面的值只是为方便展示
    chenluo0429
        5
    chenluo0429  
       2020-03-11 14:25:15 +08:00
    @chenstack 显然不应该在基类去处理子类的问题。对于基类来说,子类是不可知的。可以在 base 实现一个配置读取的方法,然后在 derived 去 override
    Handle
        6
    Handle  
       2020-03-12 10:22:51 +08:00
    或许不应该在 constructor 里面做?
    可以新建一个方法来判断子类
    chenstack
        7
    chenstack  
    OP
       2020-03-12 13:01:21 +08:00
    @Handle 因为想在 constructor 里面就做读取配置这个操作,新建一个方法在 constructor 调用也是一样的结果,现在我由子类传递这个参数给父类的 constructor 初始化了
    chnwillliu
        8
    chnwillliu  
       2020-03-14 19:18:25 +08:00 via Android
    这俩东西都还不是 ES 标准呢,不是你说的 ES6 的内容。这个提案在 stage 3 里躺了一年多了,愣是进不了 stage 4。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3452 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 04:45 · PVG 12:45 · LAX 20:45 · JFK 23:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.