

新闻资讯
行业动态JavaScript原型是实现继承的核心机制,函数有prototype属性,实例通过[[Prototype]]隐式关联原型对象,构成原型链;属性查找先自身再逐级向上至Object.prototype,最终返回undefined。
JavaScript 中的“原型”(prototype)是实现对象继承的核心机制。每个函数(包括构造函数)都有一个 prototype 属性,它是一个对象,用于存放所有实例共享的属性和方法;而每个由该函数创建的对象(实例),内部都隐式关联一个原型对象(通过 [[Prototype]] 内部槽,可通过 __proto__ 或 Object.getPrototypeOf() 访问)。这种链式关联关系就构成了“原型链”,是 JavaScript 实现继承的基础。
当访问一个对象的属性或方法时,JavaScript 引擎会按以下顺序查找:
__proto__ 指向的对象)上找;Object.prototype;undefined。这个逐级向上查找的过程就是原型链。例如:arr = [1, 2],arr.push() 并不在数组实例上,而是在 Array.prototype 上;arr.toString() 则来自更上层的 Object.prototype。
传统方式是让子类型的构造函数的 prototype 指向父类型的一个实例(即“原型链继承”),但更常用的是组合模式:用 Object.create(Parent.prototype) 设置子类原型,并修正 constructor 指回子类。
Child.prototype = Object.create(Parent.prototype);
Child.prototype.constructor = Child;
Child.prototype 上,父类方法自动可继承。现代写法中,class 语法只是语法糖,底层仍基于原型链:class Child extends Parent 等价于上述操作。
prototype 是函数才有的属性;__proto__ 是实例对象的内部原型引用(非标准但广泛支持);Object.getPrototypeOf(obj) 是获取对象原型的标准方法。
prototype 决定了它创建的实例的 __proto__ 值;__proto__ 都是 Function.prototype;Object.prototype,其 __proto__ 为 null。日常开发中,用 class 和 extends 已足够
清晰安全,不建议直接改写 __proto__ 或乱设 prototype。但理解原型链对调试、阅读源码、处理动态行为(如代理、混入)非常关键。比如 instanceof 就是通过检查原型链是否包含某构造函数的 prototype 来判断的。