面试题答案
一键面试Animal
的实例方法eat
在Dog
的实例中的查找路径
- 当在
Dog
的实例上调用eat
方法时,JavaScript 引擎首先会在该实例自身的属性中查找eat
方法。由于Dog
实例自身并没有直接定义eat
方法,所以查找会失败。 - 接着,引擎会沿着原型链向上查找。因为
Dog
构造函数继承自Animal
,Dog
的原型(Dog.prototype
)是Animal
的一个实例,所以会在Dog.prototype
(也就是Animal
的实例)中查找eat
方法。由于eat
方法定义在Animal
的原型上,而Dog.prototype
是Animal
的实例,所以在这里会找到eat
方法并执行。
原型继承机制对性能的潜在影响
- 优点:
- 内存共享:多个实例可以共享原型上的方法和属性,节省内存空间。例如,所有
Dog
实例都可以共享Animal
原型上的eat
方法,而不需要在每个Dog
实例中都创建一个eat
方法的副本。
- 内存共享:多个实例可以共享原型上的方法和属性,节省内存空间。例如,所有
- 缺点:
- 查找时间:随着原型链的增长,查找属性和方法的时间会增加。因为每次查找都需要沿着原型链一级一级向上查找,直到找到目标属性或方法,或者到达原型链的顶端(
Object.prototype
)。如果原型链很长,查找效率会降低。
- 查找时间:随着原型链的增长,查找属性和方法的时间会增加。因为每次查找都需要沿着原型链一级一级向上查找,直到找到目标属性或方法,或者到达原型链的顶端(
在Dog
的实例上直接修改eat
方法对原型链的影响
当在Dog
的实例上直接修改eat
方法时,会在该实例自身创建一个新的eat
方法,这个新的eat
方法会屏蔽原型链上的eat
方法。也就是说,以后在该实例上调用eat
方法时,会直接调用实例自身新创建的eat
方法,而不再查找原型链上的eat
方法。但是,其他Dog
实例不受影响,它们仍然会使用原型链上的eat
方法,因为每个实例的自有属性是独立的。