普通对象的 proto 指向其构造函数的 prototype,new 实例时引擎自动设置;字面量对象对应内置构造函数原型;object.create() 直接指定原型;推荐用 object.getprototypeof() 等标准 api 替代 __proto__。

普通对象的 __proto__ 指向其构造函数的 prototype,这是 JavaScript 原型链机制的核心规则之一。关键在于:对象创建时,引擎会自动把该对象的 __proto__ 设置为它构造函数的 prototype 对象。
构造函数创建的对象
当你用 new Foo() 创建实例时,JavaScript 引擎会执行以下关键步骤:
- 创建一个新空对象
- 将这个新对象的
__proto__指向Foo.prototype - 将
this绑定到该对象,并执行构造函数体
例如:
function Person(name) { this.name = name; }const p = new Person('Alice');
console.log(p.__proto__ === Person.prototype); // true
字面量创建的对象(如 {}、[]、/.../)
这类对象虽没显式调用构造函数,但底层仍对应内置构造函数:
-
{}等价于new Object()→__proto__指向Object.prototype -
[]等价于new Array()→__proto__指向Array.prototype -
/abc/等价于new RegExp('abc')→__proto__指向RegExp.prototype
所以:({}).__proto__ === Object.prototype // true
Object.create() 创建的对象
这种方式绕过了构造函数,直接指定原型:
-
Object.create(proto)创建的对象,其__proto__直接等于传入的proto - 此时没有“构造函数”参与,但
__proto__依然被明确设置
例如:const obj = Object.create({x: 1});
console.log(obj.__proto__.x); // 1
注意:__proto__ 不是标准属性,应优先用 Object.getPrototypeOf()
__proto__ 是历史遗留的非标准属性(尽管被广泛支持),推荐使用标准 API:
- 读取原型:
Object.getPrototypeOf(obj) - 设置原型(慎用):
Object.setPrototypeOf(obj, proto) - 创建带指定原型的对象:
Object.create(proto)
这样更安全、语义更清晰,也避免在严格模式下可能引发的问题。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











