javascript原型是什么_原型链如何工作【教程】

11次阅读

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

javascript原型是什么_原型链如何工作【教程】

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 加方法后,所有数组都能用 —— 但若某个数组自己定义了同名属性,那它就再也访问不到原型上的版本了,而且这个遮蔽不可逆(除非删掉自身属性)。

text=ZqhQzanResources