zoukankan      html  css  js  c++  java
  • JS原型链原理(链表)

     
    任何一个对象都有一个prototype的属性,在js中可以把它记为:__proto__
     

    当初ECMAscript的发明者为了简化这门语言,同时又保持继承的属性,于是就设计了这个链表。。
    在数据结构中学过链表不,链表中有一个位置相当于指针,指向下一个结构体。

    于是乎__proto__也一样,每当你去定义一个prototype的时候,相当于把该实例的__proto__指向一个结构体,那么这个被指向结构体就称为该实例的原型。

    文字说起来有点儿绕,看图说话

    代码如下:
    var foo = {
    x: 10,
    y: 20
    };

    Figure 1. A basic object with a prototype.
    当我不指定__proto__的时候,foo也会预留一个这样的属性,

    如果有明确的指向,那么这个链表就链起来啦。

    很明显,下图中b和c共享a的属性和方法,同时又有自己的私有属性。

    __proto__默认的也有指向。它指向的是最高级的object.prototype,而object.prototype的__proto__为空。

    代码如下:
    var a = {
    x: 10,
    calculate: function (z) {
    return this.x + this.y + z
    }
    };
    var b = {
    y: 20,
    __proto__: a
    };

    var c = {
    y: 30,
    __proto__: a
    };

    // call the inherited method
    b.calculate(30); // 60

    Figure 2. A prototype chain.
    理解了__proto__这个属性链接指针的本质。。再来理解constructor。

    当定义一个prototype的时候,会构造一个原形对象,这个原型对象存储于构造这个prototype的函数的原形方法之中.

    代码如下:
    function Foo(y){
    this.y = y ;
    }

    Foo.prototype.x = 10;   //Foo.prototype也是个对象,这个对象存储在Foo()构造函数的prototype方法中

    Foo.prototype.calculate = function(z){
    return this.x+this.y+z;
    };

    var b = new Foo(20);

    alert(b.calculate(30));

    Figure 3. A constructor and objects relationship.

  • 相关阅读:
    前端构建工具gulpjs的使用介绍及技巧(转载)
    jq checked 设置问题
    JavaScript面向对象及相关知识
    github 操作指南
    WebStorm常用快捷键
    Windows下Scala环境搭建
    For与Function进阶实战、Lazy的使用笔记总结
    第3课 Scala函数式编程彻底精通及Spark源码阅读笔记
    第2课 Scala面向对象彻底精通及Spark源码SparkContext,RDD阅读总结
    第1课 Scala入门与实战笔记总结
  • 原文地址:https://www.cnblogs.com/3body/p/5417280.html
Copyright © 2011-2022 走看看