javascript 类方法不重写类字段

0lvr5msh  于 2023-01-16  发布在  Java
关注(0)|答案(1)|浏览(161)

非常奇怪的行为。为什么下面的日志**“A.fn”只运行,而下一行“B.fn”甚至不运行?下面的代码到底发生了什么?
我使用的是
巴别塔第二阶段**,这是大多数React项目中使用的。

class A {
    fn = () => {
        console.log("A.fn");
    }
}

class B extends A {
    fn() {
        super.fn();
        console.log('B.fn')
    }
}

new B().fn(); // why this logs "A.fn" only, while "B.fn" isn't logged?
gj3fmq9x

gj3fmq9x1#

我能确切地知道下面这段代码发生了什么吗?
公共类字段等效于:

class A {
  constructor() {
    this.fn = () =>  console.log("A.fn");
  }
}

也就是说,fn是在示例本身上定义的,而当使用方法语法时,方法是在原型上定义的。让我们记录B的示例:

第一个fn是在构造函数中创建的,第二个是定义为B的类方法的,因为fn是在示例上定义的,即在原型链中“较高”,它 * 遮蔽 * B.prototype.fn,意味着B.prototype.fn从未被调用。

这就是原型连锁店的运作方式

下面是一个简单的例子,也有同样的问题:

const proto = {fn() { console.log('proto'); }};
const obj = Object.create(proto);
obj.fn = () => console.log('instance');
obj.fn();

相关问题