美文网首页
理解js中的原型链,prototype与__proto__的关

理解js中的原型链,prototype与__proto__的关

作者: 挣脱吧小白 | 来源:发表于2017-02-26 17:37 被阅读0次

一、了解创建函数对象时new的过程。 我们先看一段代码:

    <script type="text/javascript">
        var Person = function () { };
        var p = new Person();
    </script>
我们可以把new的过程拆分成以下三步:

    <1> var p={}; 初始化一个对象p。

    <2> p.__proto__=Person.prototype;

    <3> Person.call(p);也就是说构造p,也可以称之为初始化p。

二、 此三步的关键点时是第二步,以下为证明材料证明一下:

   <script type="text/javascript">
         var Person = function() { };
         var p = new Person();
         alert(p.__proto__ === Person.prototype);
   </script>

1、首先,我们先理解下proto是什么?

    每个对象都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,这个__proto__又会有自己的__proto__,一直找下去,这也就是我们平时所说的原型链的概念。
2、了解proto属性特点
     按照标准,__proto__是不对外公开的,也就是说是个私有属性,但   是Firefox的引擎将他暴露了出来成为了一个共有的属性,我们可以对外访问和设置。

3、让我们看一下下面这些代码:

   <script type="text/javascript">
          var Person = function () { };
              Person.prototype.Say = function () {
                     alert("Person say");
                 }
          var p = new Person();
              p.Say();
   </script>

那就让我们看下为什么p可以访问Person的Say?

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

4、让我们看个更复杂的原型链例子。

   <script type"text/javascript">
          var Person = function () { };
              Person.prototype.Say = function () {
                   alert("Person say");
               }
              Person.prototype.Salary =20000;
          var Programmer = function () { };
              Programmer.prototype = new Person();
              Programmer.prototype.WriteCode = function() {
                   alert("programmer writes code");
              };
              Programmer.prototype.Salary = 10000;
          var p = new Programmer();
              p.Say();
              p.WriteCode();
              alert(p.Salary);
   </script>

我们来做这样的推导:

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”)的方法。

其它同理。

三、一幅图说明它们之间的关系

Javascript中12个内置对象,其中10个函数类型,2个对象类型。


Paste_Image.png

上图有十种构造器函数,分别为:date Array Number Object Bloolean String Event Error RegExp Function,这些构造器函数都可以通过new来实例化一个对象

注意:

1、所有构造器的prototype都是对象(object)类型,只有Function.prototype是函数(function)类型,这是为了保证函数构造器们的__proto__指向的都是函数。
2、JSON和Math不是构造器函数,他们是普通的对象。只有构造器函数才能使用new 关键字实例化一个对象,而JSON和Math已经是对象了,所以我们可以不用实例化直接使用JSON和Math中的属性和方法。

相关文章

  • JavaScript 学习

    JS 原型与原型链 每个对象都有 __proto__属性,但只有函数对象才有 prototype 属性 所有对象的...

  • JavaScript原型链

    js原型链 原型链是JS面向对象的基础非常重要 所有对象只有__proto__属性,而函数具有prototype属...

  • 理解js中的原型链,prototype与__proto__的关

    一、了解创建函数对象时new的过程。 我们先看一段代码: 二、 此三步的关键点时是第二步,以下为证明材料证明一下:...

  • js基础知识(二)

    一、js原型和原型链 1、原型讲解: 普通的对象:是没有prototype属性的,只有隐藏属性__proto__,...

  • 理解prototype和__proto__以及construct

    在此例子中,对象实例a的__proto__指向其构造函数A的原型链prototype对象;js函数本身也是对象,构...

  • js 原型链继承__proto__、prototype简析

    js中的继承关键是靠__proto__属性实现的prototype属性的职责是将原型链中的数据放入__proto_...

  • JS原型链

    JS原型链 回顾一下类,实例,prototype,__proto__的关系 另外有: 对于p1.construcr...

  • JS原型链

    最简短精炼的JS原型链介绍:1.所有函数的__ proto__都是Function.prototype2.所有实例...

  • js面向对象

    1.函数的原型链(__ proto__,prototype,constructor ) 函数的原型(prototy...

  • js原型链中的__proto__和prototype

    在学习js原型链 的过程中,大家肯定碰到过属性__proto__和prototype,下面就举例说明下构造函数、隐...

网友评论

      本文标题: 理解js中的原型链,prototype与__proto__的关

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