JavaScript原型是对象内部隐式关联的普通对象,用于属性和方法查找;每个对象有[[Prototype]]内部槽指向原型(可为null),通过Object.getPrototypeOf读取,属性查找沿原型链进行但写操作只作用于自身。

JavaScript 原型不是“类模板”,也不是“父类”,它是每个对象内部隐式关联的一个普通对象,用来提供共享属性和方法的查找源头。
每个对象都有 [[Prototype]] 内部槽
这个槽指向它的原型对象(可以是 null)。你不能直接访问 [[Prototype]],但可以用 Object.getPrototypeOf(obj) 读取,或用 obj.__proto__(不推荐)或 Object.setPrototypeOf() 修改。
-
{}.__proto__ === Object.prototype—— 空对象的原型是Object.prototype -
Array.isArray([])能工作,是因为[].__proto__指向Array.prototype,而它又链向Object.prototype - 函数对象的
[[Prototype]]是Function.prototype,不是Object.prototype—— 这点常被误认为“函数继承自 Object”
new Foo() 创建的对象,其原型是 Foo.prototype
这是原型链形成的起点。注意:Foo.prototype 是函数 Foo 的一个自有属性,它默认是个普通对象,且自带 constructor 指回 Foo。
- 执行
const a = new Foo()后:Object.getPrototypeOf(a) === Foo.prototype - 如果
Foo.prototype.method = function(){},那么a.method()就能调用 —— 因为查找时先查a自身,没找到就顺着[[Prototype]]找到Foo.prototype - 别手动改
Foo.prototype = {...}后忘了补constructor,否则a.constructor会变成Object
属性查找走的是原型链,不是作用域链
每次读取对象属性(如 obj.x),JS 引擎按顺序检查:obj 自身 → obj.[[Prototype]] → obj.[[Prototype]].[[Prototype]] → …… 直到 null。
立即学习“Java免费学习笔记(深入)”;
- 写操作(
obj.x = 1)**永远不会**写到原型上,只会在obj自身添加或覆盖属性 -
hasOwnProperty只检查自身,in操作符才查整条链 - 性能上,链越长、中间层级越“胖”(属性多),查找越慢;避免在原型上放大量数据属性
-
Object.create(null)创建的对象没有原型,[[Prototype]]是null—— 适合做纯哈希表,不会意外继承toString等
原型链真正容易出问题的地方,往往不在“怎么连”,而在“谁在查、谁在写、谁被遮蔽”。比如给 Array.prototype 加方法后,所有数组都能用 —— 但若某个数组自己定义了同名属性,那它就再也访问不到原型上的版本了,而且这个遮蔽不可逆(除非删掉自身属性)。









