prototype和__proto__

对应有道云笔记地址(有道云上排版更优):http://note.youdao.com/noteshare?id=884b325c5a6e0e510672a3db92de6a1e&sub=B6995C2240E14F76887E062038BBE9A6

/**
* Created by: yel
* Date: 2018.01.12
* from: http://rockyuse.iteye.com/blog/1426510
*/

prototype只是一个假象,他在实现原型链中只是起到了一个辅助作用,换句话说,他只是在new的时候有着一定的价值,而原型链的本质,其实在于__proto__!

 


我们首先来看下new究竟做了什么

var Person = function () { };
var p = new Person();

 

上述中new的过程可以简易拆分成4步:
第一步:创建一个空对象(此处随便命个名:obj);
第二步:obj.__proto__ = Person.prototype;
第三步:var ressult = Person.call(obj);
第四步:return result? result : obj;


每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,
这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。
按照标准,对象的__proto__是不对外公开的。


而constructor则是指向自身构造函数
eg:
  function Animal(){
  }
  var cat = new Animal();
  cat.constructor === Animal

  其本质->
  1.function Animal(){}之后,自动完成Animal.prototype = {
    constructor:Animal(){}
  }这一操作


  2.cat.__proto__ = Animal.prototype


  3.Animal.call(cat);
  所以我们读取的cat.constructor实际是Animal.prototype.constructor

posted @ 2018-10-09 16:58  鳯訡  阅读(162)  评论(0编辑  收藏  举报