构造函数的 prototype 与__proto__ 区别与联系

clipboard.png
图片描述

我想问一下大家:
这个构造函数的 prototype 和__proto__ 属性到底什么区别?
function M () {}
M.prototype 是M的原型对象
M.__proto__ 指向 Function.prototype ??
M.__proto__ 这个又是一条原型链?
M 的这两个属性到底啥区别和联系?
该如何理解
烦请大神指点迷津? 谢谢,我这个问题迷惑了两天了,大哭

阅读 3.4k
6 个回答

1、属性
prototype是构造函数(function)的一个属性
__proto__是实例的一个属性(实例:通过构造函数创建的对象)

2、分析

// 人类(构造函数,类) 也可以用class写
function Person(){}
// 给人类添加 吃 的方法(每个人都有)
Person.prototype.eat = function(){}

let eric = new Person(); // 创建一个人类
eric.eat(); // 通过Person类创造的实例可以直接访问eat方法,而eric对象并没有eat属性,只有__proto__

3、结论
1、实例(eric)中的 proto 和 类(Person)中的prototype是同一个东西(地址一致),可以通过 eric.__proto__ === Person.prototype 验证

2、prototype用来定义公共方法,__proto__用来访问公共方法

你应该去网上学习下什么是原型链:从数据类型讲原型原型链

原型链是通过__proto__属性串连在一起的一组对象,上到Object.prototype(也可以说是null)。__proto__规定了对象的继承关系。

如果说构造函数是母体,那么prototype就是他的伴生对象(丈夫、孩子他爹),__proto__是他爸。

从这一块来看,他们并没什么关系(岳父和女婿?)。从整条原型链来看,他们还是有点关系的,这个就得你自己去看了,网上很多。

function Person() {} //即是构造函数,也是Function的实例
var one = new Person() //实例
//
one.__proto__ 是指one的构造函数的原型对象 === Person.prototype
one.prototype // undefined 查找one的属性和方法时会借助.__proto__去原型链上去查找
Person.prototype 是指Person的原型对象
Person.__proto__ 是指Person的构造函数的原型对象
Person也是一个实例对象,它的构造函数是Function
二者还是有区别的!

就按照你给的例子

首先函数在 js 里也是一个对象,那么只要是对象就有 __proto__ 这个属性,这个属性表示了这个对象的原型,而函数是 Function 的实例,所以函数的 __proto__ === Function.prototype

同时 Person 是一个构造函数,构造函数拥有 prototype 属性,用于在实例化对象时设置对象的 __proto__ 也就是原型。

let a = new Person()
a.__proto__ === Person.prototype 
// true

obj.__proto__ === obj.constructor.prototype
不改prototype的话

推荐问题
宣传栏