Javascript之 __proto__ 与 prototype

 

__proto__(隐式原型)与prototype(显式原型)

  是什么?

  • 显式原型 explicit prototype property:

每个函数在建立以后都会拥有一个名为prototype的属性,这个属性指向函数的原型对象。浏览器

  • 隐式原型 implicit prototype link:
JavaScript中任意对象都有一个内置属性[[prototype]],在ES5以前没有标准的方法访问这个内置属性,
可是大多数浏览器都支持经过__proto__来访问。ES5中有了对于这个内置属性标准的Get方法Object.getPrototypeOf().
  Object.prototype 这个对象是个例外,它的__proto__值为null
  • 两者的关系:

隐式原型指向建立这个对象的构造函数(constructor)的prototypeapp

  做用?

  • 显式原型的做用:用来实现基于原型的继承与属性的共享。
  • 隐式原型的做用:构成原型链,一样用于实现基于原型的继承。举个例子,当咱们访问obj这个对象中的x属性时,

   若是在obj中找不到,那么就会沿着__proto__依次查找。函数


 

实例:spa

声明构造函数A,给A的原型对象添加一个属性和一个方法,prototype

用函数A建立一个对象a:code

1 A.prototype.name = "Jack"; 2 A.prototype.say = function () { 3     console.log("hello"); 4 }
6 function A() { 7     8 } 9 var a = new A( );

咱们来观察一波控制台的输出。。。对象

 首先,对象a的__proto__(隐式原型)指向A的prototype(原型对象)blog

 而a.__proto__.__proto__又等价于下面那一大串东西,其实也等价于全部对象的祖先的原型对象——Object.prototype继承

 而在原型链的定义中,Object.prototype即原型链的终点,再往上就没有了。ip

 

 

 而构造函数A的prototype,也就是对象a的__proto__所指向的地方

 

* 构造函数A的__proto__又指向什么?

 

 

    隐式原型指向构造该对象的构造函数的原型(A.__proto__ === A.constructor.prototype)。

由于function是特殊的对象,"Function.prototype",即全部函数的原型,一般函数均可以认为是经过new Function制造出来的。

换句话说,Function.prototype上面承载了用于继承给全部函数的那些属性,例如:call、bind、apply等。


 

部份内容参考自:https://www.zhihu.com/question/34183746/answer/59043879

相关文章
相关标签/搜索