对象实例可直接访问原型上可枚举且未被自身覆盖的属性,引擎按自身→__proto__→原型链向上查找;构造函数prototype或class方法均定义在原型上;hasOwnProperty()判自有属性,in操作符判所有属性。

对象实例可以直接访问原型上的属性,只要该属性是可枚举且未被自身覆盖,JavaScript 会自动沿原型链向上查找。
原型链查找机制
当访问一个对象的属性时,JavaScript 引擎会按以下顺序查找:
- 先在对象自身上查找该属性
- 如果没找到,就去它的
__proto__(即构造函数的prototype)上找 - 如果还没找到,继续沿
__proto__链向上,直到到达Object.prototype或为null
通过构造函数定义原型属性
常见方式是在构造函数的 prototype 上添加属性或方法:
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
return `Hello, I'm ${this.name}`;
};
const p = new Person('Alice');
console.log(p.sayHello()); // "Hello, I'm Alice" —— 调用的是原型上的方法
使用 class 语法等价写法
class 是语法糖,本质仍是基于原型:
立即学习“Java免费学习笔记(深入)”;
class Animal {
constructor(type) {
this.type = type;
}
speak() {
return `${this.type} makes a sound`;
}
}
const dog = new Animal('Dog');
console.log(dog.speak()); // "Dog makes a sound" —— 方法来自原型
检查属性是否来自原型
可用 hasOwnProperty() 区分自有属性和继承属性:
-
p.hasOwnProperty('name')→true(自有) -
p.hasOwnProperty('sayHello')→false(来自原型) -
'sayHello' in p→true(无论自有还是继承)


















