本文通过三张示意图和示例代码,清晰解析JavaScript中prototype与__proto__的区别。文章解释了对象字面量、构造函数及Object.create创建对象时原型指向的差异,并梳理了原型链的查找机制,帮助开发者理清复杂的原型关系。
原型机制的难点与解析思路
对于初学者而言,理解JavaScript的原型机制往往颇具挑战。主要难点在于prototype与__proto__容易混淆,且二者之间的指向关系错综复杂。尽管市面上已有大量文章试图阐释这一概念,并流传着各种连接复杂的经典图示,但往往令人阅读后仍感困惑,难以透彻掌握。因此,本文尝试将原型中的核心知识点拆解,利用简洁的图表形式进行说明。
prototype与__proto__的核心区别
原型本质上是一个对象,其他对象可借助它实现属性继承。然而,除了prototype外,__proto__的作用是什么?两者名称相似,极易混淆,且指向关系混乱,难以记忆。原型链又是何物?相信不少初学者甚至部分资深开发者也难以完全厘清。下文将通过三张简图配合示例代码,帮助读者深入理解。
一、prototype和__proto__的区别

对象字面量与函数的原型指向
var a = {};
console.log(a.prototype); //undefined
console.log(a.__proto__); //Object {}
var b = function(){}
console.log(b.prototype); //b {}
console.log(b.__proto__); //function() {}

不同创建方式下的原型链关系
/*1、字面量方式*/
var a = {};
console.log(a.__proto__); //Object {}
console.log(a.__proto__ === a.constructor.prototype); //true
/*2、构造器方式*/
var A = function(){};
var a = new A();
console.log(a.__proto__); //A {}
console.log(a.__proto__ === a.constructor.prototype); //true
/*3、Object.create()方式*/
var a1 = {a:1}
var a2 = Object.create(a1);
console.log(a2.__proto__); //Object {a: 1}
console.log(a.__proto__ === a.constructor.prototype); //false(此处即为图1中的例外情况)

原型链的查找机制
var A = function(){};
var a = new A();
console.log(a.__proto__); //A {}(即构造器function A 的原型对象)
console.log(a.__proto__.__proto__); //Object {}(即构造器function Object 的原型对象)
console.log(a.__proto__.__proto__.__proto__); //null
总结
以上就是本文的全部内容了,本文用三张图解释了JavaScript的原型对象与原型链,希望对大家学习JavaScript的时候有所帮助。