prototype仅函数对象拥有,用于定义实例继承;普通对象无prototype但有__proto__指向其构造函数的prototype,object.prototype为原型链终点。

因为 prototype 是函数对象的专属属性,而普通对象(比如 {}、[]、new Date())不是函数,也不用作构造器,所以没有 prototype 属性。
prototype 只属于函数对象
JavaScript 规范明确规定:只有函数对象(包括内置函数如 Object、Array,以及自定义函数)在创建时自动拥有 prototype 属性。这个属性是为“被 new 调用”做准备的——它将来会成为实例对象的原型来源。
-
function Foo() {}→Foo.prototype存在,值是一个默认带constructor的普通对象 -
const obj = {}→obj.prototype是undefined,因为obj不是函数 -
const arr = []→arr.prototype同样是undefined
普通对象靠 __proto__ 连接原型链
普通对象虽然没有 prototype,但每个对象(包括函数对象)都有一个内部属性 [[Prototype]],浏览器普遍用 __proto__ 暴露它。这个属性指向该对象的“真正原型”,也就是它的构造函数的 prototype。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
const obj = {}→obj.__proto__ === Object.prototype(因为它是Object构造出来的) -
const arr = []→arr.__proto__ === Array.prototype -
function Fn() {}→Fn.__proto__ === Function.prototype(因为函数本身也是Function的实例)
本质区别:用途不同
prototype 是“我将来要当爸爸时,给孩子准备的基因库”;__proto__ 是“我出生后,身上自带的家谱指针”。
-
prototype用于定义“未来实例能继承什么” -
__proto__用于运行时查找属性和方法(即原型链查找) - 普通对象不负责“生孩子”,所以不需要准备
prototype;但它必须知道自己“从哪来”,所以有__proto__
补充说明:Object.prototype 是终点
所有对象的 __proto__ 最终都会指向 Object.prototype,而 Object.prototype.__proto__ 是 null。这标志着原型链终止——普通对象的继承路径到此为止,无需也无权拥有自己的 prototype。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










