我在mozila开发人员站点找到了这段代码:
class Car {
sayHi() {
console.log('Hello from car');
}
}
class Bird {
}
const car = new Car();
const bird = new Bird();
bird.sayHi = car.sayHi;
bird.sayHi(); //Why it works?!!!
最后一行如何以及为什么不定义第二个类中的方法或从Car类继承该方法?
2条答案
按热度按时间kmpatx3s1#
让我们来看看这里到底发生了什么。
1.为Car定义类,这将创建一个名为
Car
的构造函数,并为该类创建一个原型。1.在类定义中定义
sayHi()
方法,这样就将sayHi
方法添加到Car原型中。1.为Bird定义类,创建一个名为
Bird
的构造函数,并为该类创建一个原型。1.创建每个类的一个示例,这将创建一个对象,分配相应的原型并运行构造函数(如果有)。
1.您执行
bird.sayHi = car.sayHi;
。它有两个部分。首先,它读取car.sayHi
。由于car
对象上没有名为sayHi
的自有属性,解释器检查该对象的原型链并找到原型上的sayHi
方法。然后,它获取找到的方法并将其作为自身属性分配给bird
对象(直接在bird
对象上的属性。请记住,一个方法就是一个存储在对象上的函数。2你可以从对象上获取这个函数,然后像使用其他函数一样使用它(当从其原始上下文中移除时,它可能正常工作,也可能不正常工作-这取决于它的用途)。1.然后,执行
bird.sayHi()
,解释器在bird
对象中查找自己的属性sayHi
,找到您刚刚赋值的属性,获取该方法并执行,您在控制台中得到输出。ajsxfq5m2#
函数是第一类对象。
在内部,
car
是一个空对象,其原型定义了sayHi
属性。然后,使用
bird.sayHi = car.sayHi
设置bird.sayHi
属性。