原型链解读

本文思路:想了解原型链,必须知道什么是原型,那么原型又是怎么产生的,追本溯源的来理解原型链。

原型怎么来:

创建对象的三种方式:

1、字面量的方式——原始、简单,但是麻烦
2、调用系统的构造函数——挺好,但受限制
3、自定义构造函数——那就这种,又方便又自由

此时,我们来写个创造“人”的对象的构造函数,看代码:

    function Person(name,age) {
      this.name=name;
      this.age=age;
      this.makeTool=function () {
        console.log("制造工具");
      };
    }

    var p1 = new Person("Jack",18)
    var p2 = new Person("Mark",21)
    var p3 = new Person("Susan",18)

每当我们new一个person的时候,每个人都有名字、年龄,都会制造工具,但制造工具是相同的能力(方法)。
于是,我们给Person()这个构造函数一个属性prototype:

    Person.prototype.makeTool = function(){
      console.log("制造工具")
    }

我们可以通过p1.makeTool()来调用这个方法,p1 p2 p3都可以公用这个方法,这样我们就节省了内存,共享了数据,这也是prototype的作用之一,prototype就是原型

充分理解原型链

    //动物有名字,有体重,有吃东西的行为
    //狗有名字,有体重,有毛色, 有吃东西的行为,还有咬人的行为
    //金毛有名字,有体重,有毛色,性别, 有吃东西的行为,还有咬人的行为,保护主人的行为

    function Animal(name,weight) {
      this.name=name;
      this.weight=weight;
    }
    //动物的原型的方法
    Animal.prototype.eat=function () {
      console.log("天天吃东西,就是吃");
    };

    //狗的构造函数
    function Dog(color) {
      this.color=color;
    }
    Dog.prototype=new Animal("哮天犬","50kg");
    Dog.prototype.bitePerson=function () {
      console.log("哼~汪汪~咬死你");
    };

    //金毛
    function jinMao(sex) {
      this.sex=sex;
    }
    jinMao.prototype=new Dog("黑白色");
    jinMao.prototype.protectHost=function () {
      console.log("汪汪汪,保护主人");
    };
    var jinMao=new ErHa("雄性");
    console.log(jinMao.name,jinMao.weight,jinMao.color); //哮天犬 50kg 黑白色
    jinMao.eat();                  //天天吃东西,就是吃
    jinMao.bitePerson();      //哼~汪汪~咬死你
    jinMao.protectHost();     //汪汪汪,保护主人

以上代码画图表示原型链:


原型链.png

通过以上例子,再将原型链扩展:


原型链完整.png

每当代码读取某个对象的某个属性,都会执行一次搜索,目标是具有给定名字的属性,搜索首先从对象实例本身开始,如果在实例中找到了具有给定名字的属性或方法,则返回该属性的值;如果没有找到,则继续搜索指针指向的原型对象,在原型对象中查找具有给定名字的属性或方法。

以上,便是对原型链的解读。

--end

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 6,433评论 0 6
  • 第3章 基本概念 3.1 语法 3.2 关键字和保留字 3.3 变量 3.4 数据类型 5种简单数据类型:Unde...
    RickCole阅读 10,642评论 0 21
  • 前言 在JavaScript中没"子类”和“父类”的概念,进一步地也没有“类”和“实例”的的区分。它靠一种看上去十...
    vzardlloo阅读 4,170评论 0 5
  • 关于原型链的调用原理 只要明白js里访问一个对象的方法或属性的过程,就能彻底搞明白js的原型链。(首先要明确,js...
    地罗神阅读 1,534评论 0 0
  • 面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScr...
    DHFE阅读 4,574评论 0 4