美文网首页
__proto__和prototype的理解

__proto__和prototype的理解

作者: Buff飘 | 来源:发表于2016-09-03 17:08 被阅读114次

    先看一段代码:

    varPerson=function( ) {

    }

    varp=newPerson( );

    p.__proto__=Person.prototype

    alert(p.__proto__===Person.prototype);//true

    这段代码会返回true。

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

    好,概念说清了,让我们看一下下面这些代码:

    这段代码很简单,相信每个人都这样写过,那就让我们看下为什么p可以访问Person的Say。

    //变量方式构造函数

    varPerson=function() { };

    Person.prototype.Say=function() {

    alert("Person say");

    }

    var p=new Person();

    p.Say();

           首先var p=new Person();可以得出p.__proto__=Person.prototype。那么当我们调用p.Say()时,首先p中没有Say这个属性,于是,他就需要到他的__proto__中去找,也就是Person.prototype,而我们在上面定义了Person.prototype.Say=function(){}; 于是,就找到了这个方法。

    Firefox图示:

    好,接下来,让我们看个更复杂的。

    varPerson=function() { };

    Person.prototype.Say=function() {

    alert("Person say");

    }

    Person.prototype.Salary=50000;

    varProgrammer=function() { };

    Programmer.prototype=newPerson();

    Programmer.prototype.WriteCode=function() {

    alert("programmer writes code");

    };

    Programmer.prototype.Salary=500;

    varp=newProgrammer();

    console.log(p)

    p.Say();

    p.WriteCode();

    alert(p.Salary);

    Firefox控制台示意图:

    我们来做这样的推导:

    var p=new Programmer()可以得出p.__proto__=Programmer.prototype;

    而在上面我们指定了Programmer.prototype=new Person();我们来这样拆分,var p1=new Person();Programmer.prototype=p1;那么:

    p1.__proto__=Person.prototype;

    Programmer.prototype.__proto__=Person.prototype;

    由根据上面得到p.__proto__=Programmer.prototype。可以得到p.__proto__.__proto__=Person.prototype。

    好,算清楚了之后我们来看上面的结果,p.Say()。由于p没有Say这个属性,于是去p.__proto__,也就是Programmer.prototype,也就是p1中去找,由于p1中也没有Say,那就去p.__proto__.__proto__,也就是Person.prototype中去找,于是就找到了alert(“Person say”)的方法。

    其余的也都是同样的道理。

    再来一张stackoverflow上的图:

    个人认为prototype可以当成是一个指针,当new一个方法的时候,指向的都是一个内存区域。

    看完这些,感觉对原型链的了解应该差不多了吧。

    参考原文链接:http://www.cnblogs.com/zzcflying/archive/2012/07/20/2601112.html

    相关文章

      网友评论

          本文标题:__proto__和prototype的理解

          本文链接:https://www.haomeiwen.com/subject/uzikettx.html