区别:
__proto__是浏览器对实例化对象中[[prototype]]属性的命名方式,__proto__是属于对象的属性,prototype是属于函数对象的属性。
__proto__指向[函数名].prototype,[函数名].prototype是函数的原型对象
示例:
function Fn1(...){...}; // 函数Fn1
let obj1 = new Fn1(...); // new关键字,会将Fn1以构造函数的形式调用,构造一个对象
obj1.__proto__ === Fn1.prototype; // true
obj1.__proto__指向Fn1.prototype(Fn1的原型对象)。
个人解读:
区别:
prototype可以理解为在函数(函数对象)上的一个名为原型对象的属性,这里的原型对象是命名和功能意义双重含义的,所以prototype是函数(函数对象)上的一个属性,保存原型对象,意义上也可以叫做原型对象。那么这个原型对象的内容是一些可以继承的属性和方法。而__proto__是对象上的一个属性,通过这个属性可以访问prototype这个函数对象上的属性里的内容,也就是说对象.__proto__
指向构造该对象的函数.prototype
。
当然,由于函数在js语言中也是对象,所以也有__proto__属性,指向构造该函数的Function.prototype,而Function.prototype这个原型也是对象,所有也有它的__proto__属性,以此类推,这就形成了一条原型链,链子的尽头是Object.prototype的__proto__,为null,这个Object非特指某一个对象,而是实际的构造所有对象的函数。
补充:
这里还要提一下constructor这个属性,理解为构造器,该属性是函数,并挂载在函数的prototype属性上。每一个由函数构造而来的对象都有一个constructor属性(继承于构造该对象的函数),该属性功能为访问(获取)构造该对象的构造函数,按以下示例理解
还是这个示例:
function Fn1(...){...}; // 函数Fn1
let obj1 = new Fn1(...); // new关键字,会将Fn1以构造函数的形式调用,构造一个对象
该函数.prototype.constructor === 该函数。该函数构造的对象.constructor继承自该函数.prototype.constructor === 该函数
Fn1.prototype.constructor === Fn1。obj1.constructor === Fn1.prototype.constructor === Fn1
标签:__,函数,Fn1,proto,对象,javaScript,prototype From: https://www.cnblogs.com/szq233/p/17057980.html