JavaScript 中原型对象中方法怎么被实例调用
通过原型链查找机制,实例可以直接调用定义在构造函数原型(prototype)上的方法。当访问实例属性或方法时,如果实例自身不存在该成员,javascript 引擎会沿着原型链向上查找,直到找到定义在原型对象中的方法并执行。

使用构造函数和 prototype 属性添加方法
最经典的方式是在构造函数内部定义实例属性,并在构造函数的 prototype 对象上定义共享方法。这样所有实例都指向同一个原型对象,节省内存。

function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log('Hello, my name is ' + this.name);
};
var p1 = new Person('Alice');
p1.sayHello(); // 输出: Hello, my name is Alice上述代码中,sayHello 方法定义在 Person.prototype 上。p1 是 Person 的实例,它自身没有 sayHello 方法,因此引擎查找 p1.__proto__(即 Person.prototype),找到该方法并调用。此时 this 指向 p1。
立即学习“Java免费学习笔记(深入)”;
使用 Object.create 创建实例
除了构造函数模式,还可以直接使用 Object.create() 基于现有对象创建新实例。新对象的原型直接指向传入的对象,从而继承其方法。

var animalMethods = {
speak: function() {
console.log(this.name + ' makes a noise.');
}
};
var dog = Object.create(animalMethods);
dog.name = 'Rex';
dog.speak(); // 输出: Rex makes a noise.这里 dog 对象是通过 Object.create(animalMethods) 创建的,所以 dog.__proto__ 等于 animalMethods。当调用 dog.speak() 时,由于 dog 自身没有 speak 方法,引擎在其原型 animalMethods 中找到该方法并执行。
基于程序中某个输入、条件或结果的具体问题
当原型链上存在同名属性或方法时,实例优先使用自身定义的成员,这种现象称为“遮蔽”(Shadowing)。如果实例自身定义了与原型同名的方法,原型上的方法将被隐藏,不会被调用。


















