__proto__是javascript中非标准的遗留属性,源于firefox早期实现,es6将其划入附录b仅限浏览器使用;应改用object.getprototypeof()、object.setprototypeof()、object.create()等标准方法替代。

直接看 __proto__ 这个属性,其实是理解 JavaScript 演进的一条暗线——它不是标准语法,却真实承载了语言从“动态拼凑”走向“规范设计”的全过程。
__proto__ 是原型链的“原始接口”
在 ES3 时代,JavaScript 尚无正式的继承语法,开发者靠手动设置对象的 __proto__ 属性来模拟类式继承。比如:
function Animal(name) { this.name = name; }
Animal.prototype.speak = function() { console.log(this.name + " makes a sound"); };
function Dog(name, breed) { this.name = name; this.breed = breed; }
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
// 有些老代码甚至直接写:
const dog = new Dog("Buddy", "Golden");
dog.__proto__ = Animal.prototype; // 不推荐,但曾真实存在
这种写法暴露了早期 JS 的本质:对象靠隐式链接(即 [[Prototype]])共享行为,而 __proto__ 是当时唯一能直接操作这条链的“后门”。
它的退场标志着语言设计的成熟
ES6 明确将 __proto__ 列为“仅用于浏览器兼容”的遗留特性,并推荐用标准方式替代:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Object.getPrototypeOf(obj)替代obj.__proto__ -
Object.setPrototypeOf(obj, proto)替代赋值obj.__proto__ = proto -
class语法和extends隐藏了原型操作细节
这不是删除功能,而是把底层机制“封装起来”,让开发者聚焦语义而非链路细节。这和 ES5 引入 Object.create()、ES6 推出 class 一脉相承——语言越来越强调可读性与可维护性。
prototype 与 __proto__ 的分工逐渐清晰
早期混淆常源于两者关系不明确:
-
Function.prototype是函数实例的“方法模板” -
obj.__proto__指向其构造函数的prototype
随着 ES5 的 Object.defineProperty() 和 ES6 的 class 出现,prototype 成为声明式定义行为的入口,而 __proto__ 被降级为运行时调试或兼容性兜底手段。这种分工细化,正是 JavaScript 从脚本语言迈向工程化语言的关键信号。
理解 __proto__ 的兴衰,等于看清 JavaScript 如何把“野路子”变成“正规军”——不是抛弃灵活性,而是把灵活性藏在更稳的结构之下。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










