• Astrogladiator-埃蒂...
    2019-12-19
    new.target为什么称为元属性,它与a.b(例如 super.xxx,或者’a’.toString)有什么不同?
    个人理解是new.target是用来描述构造器本身的属性,指代是当前这个构造器函数this, 它不属于实例对象的一部分,它可以由super函数传递至根类,并最终由根类创建带有子类实例的对象。

    作者回复: 谢谢。确实是正确答案之一。

    
     1
  • 行问
    2019-12-18
    这里的代码在 Chrome 或 Node 是报错的


    class MyClass extends Object {
      constructor() {
        return 1;
      }
    }

    function MyConstructor() {
      return 1;
    }


    console.log(new MyClass)
    console.log(new MyConstructor)
    展开

    作者回复: Oh... 这个问题在之前的课程中讲过,所以这里没有说很细。在第13讲中,

    > 因此到了 ECMAScript 6 之后,那些一般函数,以及非派生类,就延续了这一约定:使用已经创建的this对象来替代返回的无效值。
    > ... ...
    > 对于那些派生的子类(即声明中使用了extends子句的类),ECMAScript 要求严格遵循“不得在构造器中返回非对象值(以及 null 值)”的设计约定,并在这种情况下直接抛出异常。

    所以简单地说,就是如果class声明中不使用extends,那么它就跟你示例中的MyConstructor()一样,不会报错。而如果像你的MyClass那样使用了extends,就会报错了。

    
     1
  • 青史成灰
    2020-01-15
    老师,最后的这个例子:
    ```

    class MyClass {
      constructor() { return new Date };
    }

    class MyClassEx extends MyClass {
      constructor() { super() }; // or default
      foo() {
        console.log('check only');
      }
    }

    var x = new MyClassEx;
    console.log('foo' in x); // false
    ```
    因为`foo`并不在`x`实例上,那假如我要访问`foo`,那得通过什么方式?或者说,那我这个类中定义的`foo`定义到哪里去了?
    展开

    作者回复: 这个示例中,x与MyClassEx/MyClass这两个类是没有继承关系的,原型继承或类继承的逻辑在这里没有用。例如:
    ```
    > x instanceof MyClass
    false
    > x instanceof MyClassEx
    false
    ```

    你需要自已来维护原型链/继承关系,例如:
    ```
    class MyClass {
      constructor() {
        return Object.setPrototypeOf(new Date, new.target.prototype);
      }
    }

    ...

    console.log('foo' in x); //true
    console.log(x instanceof MyClassEx); // true
    console.log(x instanceof MyClass); // false
    ```

    因为继承关系跟类声明分开了,所以你可以有很多方法来灵活处理了。

    
    
  • Elmer
    2020-01-07
    定制的构造方法中,如果返回通过return传出的对象(也就是一个用户定制的创建过程),这个时候返回的对象原型并不是子类的原型,那不是不需要再设置this的原型了吗。。
    function test (){
      return {a: 1};
    }
    const b = new test();
    b instanceof test // false;此时如果test有父类也不需要设置this的原型?
    展开

    作者回复: 是的。不需要。JavaScirpt确实允许“类”返回“任意对象”。从JavaScript 1.2的设计开始,就一直如此。

    
    
  • qqq
    2019-12-18
    因为可以改变默认的原型继承行为
    
    
我们在线,来聊聊吧