代码之家  ›  专栏  ›  技术社区  ›  Yanick Rochon

如何在子类体中声明时访问和扩展ES7父类属性?

  •  0
  • Yanick Rochon  · 技术社区  · 7 年前

    class BasePage extends Component {
      state = {
        locale: 'en'
      };
    
      render() {
        return (<div>{ this.state.locale }</div>);
      }
    }
    

    我如何声明一个子类,它也将声明 state

    class FooPage extends BasePage {
      state = Object.assign( ?super.state, {
        foo: 'Hello'
      });
    
      render() {
        return (<div>{ this.state.locale } : { this.state.foo }</div>);
      }
    }
    

    很明显, super.state BasePage.prototype.state 也不存在。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Mrchief    7 年前

    class BasePage {
      state = {
        locale: 'en'
      }; 
    }
    
    class FooPage extends BasePage {
      constructor() {
        super();  // can't access this props without calling super first
    
        // this.state refers to super's state prop. We simply extend it using Object.assign.
        this.state = Object.assign(this.state, {
          foo: 'Hello'
        });
      }  
    
      render() {
        const { locale, foo } = this.state;
        console.log({ locale, foo });  // prints { locale: 'en', foo: 'Hello' }
      }
    }
    

    演示: https://repl.it/@mrchief/UrbanLiveTrace

    super 首先也适用于此)。

    class BasePage {
      get state()  {
        return { locale: 'en' }
      } 
    }
    
    class FooPage extends BasePage {
      get state()  {
        return Object.assign(super.state, {
          foo: 'Hello'
        })
      }  
    
      render() {
        const { locale, foo } = this.state;
        console.log({ locale, foo });  // prints { locale: 'en', foo: 'Hello' }
      }
    }
    

    https://repl.it/@mrchief/GloriousGainsboroOpensoundsystem