javascript 之 prototype与__proto__

起首,先引见一个本日的主角:proto(隐式原型)与prototype(显式原型)

什么是__proto__和prototype?

prototype(显式原型)
在每个函数(请注意是函数)建立以后都邑有一个叫prototype的属性,这个属性指向的是函数的原型对象。

__proto__(隐式原型)
javascript 中恣意对象都具有一个内置属性,在ES5之前并没有规范的要领接见这个属性,然则在绝大多数浏览器中都支撑经由过程__proto__来接见这个属性,我们叫他隐式原型

prototype 和 __proto__之间的联络

起首我们来看一个例子:

 function Foo(){}

 var foo = new Foo();

 foo.__proto__ === Foo.prototype; //=>true

由上面我们能够看出函数foo的隐式原型指向其组织函数的显式原型.

经由过程这个我们能得出一个如许的结论么:
某对象(万物皆对象).__proto__ === 其组织函数.prototype么,
答案是否认的,我们来看以下例子:

let obj = {name: 'zarr'};
let sonObj = Object.create(obj);
console.log(sonObj.name); //=>zarr
console.log(sonObj.__proto__ === obj.prototype) //=>false
console.log(sonObj.__proto__ === obj) //=>true 

ok,我们再看一个例子

var Obj = { a: 13 };
var obj = Object.create(Obj);
console.log(obj.a); //=>13
console.log(obj.__proto__ === Obj) //=>true

var Func = function () {
    this.a = 'ds';
}

var func = Object.create(Func);
console.log(func.__proto__ === Func.prototype) //=>false
console.log(func.__proto__ === Func) //=>true
console.log(func.a) //undefined

不是说一个对象的隐式原型即是起组织函数的原型? 为何这个时刻又即是这个组织函数了?
这就要剖析一下Object.create的完成了,实在完成起来也不难,人人看下面

Object.create = function(obj){
     function f() {} 
     f.prototype = obj;
     return new f();
}

这下晴明了, 经由过程Object.create组织出的对象实在照样new出来的对象,比方上例的var func = Object.create(Func); func.__proto__ === f.prototype === Func,
func.__proto__ === f.prototype这个照样建立的,然则因为函数f在调用完Object.create要领以后就被销毁了,所以只要func.__proto__ === Func。

ok,末了总结一下
1.对象有属性__proto__,指向该对象的组织函数的原型对象。
2.要领除了有属性__proto__,另有属性prototype,prototype指向该要领的原型对象。

    原文作者:ZARR
    原文地址: https://segmentfault.com/a/1190000013945101
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞