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

js中的原型链,prototype与__proto__的关系

作者: 壮哉我大前端 | 来源:发表于2017-03-26 22:40 被阅读0次

首先说一下new的过程
先看一段代码:

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

很简单的一段代码,我们看看这个new到底做了什么?我们可以把new的过程拆分成以下三部:
1、var p={}; //初始化一个对象p
2、p.proto = Person.prototype;
3、Person.call(p);//讲this的值赋给p
关键在于第二步,我们来证明一下:

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

这段代码返回true。说明我们步骤2是正确的。
我们在这里简单的说一下proto。每个对象都会在内部初始化一个proto属性,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去proto里找这个属性,这个proto又会有自己的proto,于是就这样一直找下去,也就是我们平时所说的原型链概念。

按照标准,proto是不对外公开的,也就是说是个私有属性,(ie中对象的proto属性为undefined),但是firefox的引擎将他暴露出来成为一个共有的属性,我们可以对外访问和设置。

我们看一下代码,为什么p可以访问Person的Say:

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

首先new Person();可以得出p.proto=Person.prototype。当我们调用p.Say()时,首先p中没有Say这个属性,于是,他就需要到他的proto中去找,也就是Person.prototype,而我们在上面定义了Person.prototype.Say=function(){};于是,就找到了这个方法。
更复杂的例子也是按照这个流程来推理,这也就是原型链的实现原理。

最后总结一下,其实prototype只是一个假象,它在实现原型链中只是起到了一个辅助作用,换句话说,他只是在new的时候有一定的价值,而原型链的本质,其实是proto

前端·哈达
好好学习,天天向上

相关文章

  • JavaScript 学习

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

  • JS原型链

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

  • JavaScript原型链

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

  • js基础知识(二)

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

  • 理解prototype和__proto__以及construct

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

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

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

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

    首先说一下new的过程先看一段代码: 很简单的一段代码,我们看看这个new到底做了什么?我们可以把new的过程拆分...

  • 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/yqclottx.html