我想问一下大家:
这个构造函数的 prototype 和__proto__ 属性到底什么区别?
function M () {}
M.prototype 是M的原型对象
M.__proto__ 指向 Function.prototype ??
M.__proto__ 这个又是一条原型链?
M 的这两个属性到底啥区别和联系?
该如何理解
烦请大神指点迷津? 谢谢,我这个问题迷惑了两天了,大哭
我想问一下大家:
这个构造函数的 prototype 和__proto__ 属性到底什么区别?
function M () {}
M.prototype 是M的原型对象
M.__proto__ 指向 Function.prototype ??
M.__proto__ 这个又是一条原型链?
M 的这两个属性到底啥区别和联系?
该如何理解
烦请大神指点迷津? 谢谢,我这个问题迷惑了两天了,大哭
你应该去网上学习下什么是原型链:从数据类型讲原型原型链
原型链是通过__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
8 回答4.8k 阅读✓ 已解决
6 回答3.5k 阅读✓ 已解决
5 回答2.9k 阅读✓ 已解决
5 回答6.4k 阅读✓ 已解决
4 回答2.3k 阅读✓ 已解决
5 回答1.3k 阅读✓ 已解决
4 回答2.8k 阅读✓ 已解决
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__用来访问公共方法