原型链是javascript实现继承的默认方式。下面来一个例子看一下她的魔法吧:

首先定义三个构造函数:

function her(){
    this.name = 'Anna';
    this.toString = function(){
        return this.name;
    }
}

function his(){
    this.sex = 'men';
}

function pepole(side, height){
    this.name = 'Jock';
    this.side = side;
    this.height = 'height';
    this.setArea = function(){
        return this.side * this.height / 2;
    }
}

接下来就是我们施展继承的魔法了:

his.prototype = new her();
pepole.prototype = new his();

发生了神马呢?在这里我们直接将对象创建在his对象的prtotype属性中,并没与去扩展这些对象的原有原型。也就是说,我们用构造函数her()创建的实例对象,用她去覆盖his构造函数的prototype属性。相同pepole也是一样,她的构造器属性prototype完全是his()通过创建实例重建的。

切记:javascript是一个完全依靠对象的语言,其中没有类的概念。因此我们需要构造一个实体new her(),然后通过实体的属性才能完成相关的继承工作,而不能直接继承her()构造函数,另外,这也确保了在继承实现以后,对her()再做任何修改,删除,添加,都不会对his()造成任何影响,因为我们所继承的不过是她所创建的一个实体。

正如上回所讲,我们对对象的prototype进行完全替换的时候(不同于向里面添加属性),与可能回对constonctor属性产生一定的副作用。

在我们完成继承相关工作之后,因该对这些对象的constructon属性进行相应的重置,这是一个非常好的习惯。

his.prototype.constructor = his;
people.prototype.constructor = people;

我们来测试一下目前实现的内容:

var my = new pepole(5,10);
my.setArea();  

尽管my没有属于自己的toString()方法,但是我们仍然可以调用她继承来的toString()方法,虽然这里调用的是一个继承的方法,但她的this仍然指向my对象。

my.toString(); // Jock

下面我们来关注一下javascript在my.toString()被调用时究竟发生了那些事情?

  1. 首先她会遍历my对象的所有属性和方法,但没有找到一个叫做toString()的方法。

  2. 接着去查看my._proto_所指的对象,也就是在继承过程中由new his()所创建的实体对象。

  3. 显然,javascript引擎在遍历people()实体的时候仍然不会找到toString()这个方法,然后又会检查该实体的_proto_属性,这时候该属性又会指向new her()所创建的实体对象.

  4. 最终,在new her()所创建的实体中找到了toString()方法。

  5. 最后, 该方法就会在my被调用,并且this也指向了my。

那么问题来了?my对象的构造函数是哪一个?

因为我们在构建继承关系时已经对相应的constructor属性进行了重置:

my.constructor === people; // true

通过instanceof操作符,我们可以验证my对象是以上三个构造函数的实例:

my instance of her;  // true
my instance of his;  // true
my instance of people;  // true

同样的,我们调用构造函数原型的isPropertypeOf()方法时结果也是如此:

her.prototype,isPrototypeOf (my); // true
his.prototype,isPrototypeOf (my); // true
people.prototype,isPrototypeOf (my); // true

我们同样可以用其他构造函数创建对象,她们同样可以获取her()的toString()方法。

javascript --- 继承初探七日谈 (一)的更多相关文章

  1. javascript --- 原型初探七日谈(一)

    在javascript中,像原型,闭包这样的概念,只要我们能领悟其中的原理,一切都会显得格外清晰与明了. 原型属性(prototype): 下面我们简单定义一个函数 function her(a, b ...

  2. javascript --- 原型初探七日谈(二)

    扩展内建对象: 在javascript中,内建对象的构造函数都是可以通过其原型来进行扩展的.这意味着我们可以做一些事情,例如我们要往数组原型中添加一个新方法,就可以在其所有的数组中使用,下面我们来试试 ...

  3. javascript --- 原型初探七日谈(三)

    原型陷阱: 在处理原型问题上时,我们要注意两种行为. 1. 当我们对原型对象执行完全替换的时候,有可能会触发原型链的某种异常. 2. prototype.constructor 属性是不可靠的. 下面 ...

  4. javascript继承的三种模式

    javascript继承一般有三种模式:组合继承,原型式继承和寄生式继承: 1组合继承:javascript最为广泛的继承方式通过原型链实现对原型属性和方法的继承,通过构造函数实现对实例属性的继承,同 ...

  5. javascript继承机制的设计思想(ryf)

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

  6. 【读书笔记】javascript 继承

    在JavaScript中继承不像C#那么直接,C#中子类继承父类之后马上获得了父类的属性和方法,但JavaScript需要分步进行. 让Brid 继承 Animal,并扩展自己fly的方法. func ...

  7. 图解JavaScript 继承

    JavaScript作为一个面向对象语言,可以实现继承是必不可少的,但是由于本身并没有类的概念(不知道这样说是否严谨,但在js中一切都类皆是对象模拟)所以在JavaScript中的继承也区别于其他的面 ...

  8. JavaScript强化教程——Cocos2d-JS中JavaScript继承

    javaScript语言本身没有提供类,没有其它语言的类继承机制,它的继承是通过对象的原型实现的,但这不能满足Cocos2d-JS引擎的要求.由于Cocos2d-JS引擎是从Cocos2d-x演变而来 ...

  9. [原创]JavaScript继承详解

    原文链接:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++. ...

随机推荐

  1. VMware 中windows server 之DHCP 搭建与测试

    感悟: 由于打算将windows server 的服务器搭建维护从头重新学习总结一下,遇到搭建dhcp服务的时候,在虚拟机中一直测试不成功,耽误我好几星期了,一点也不夸张,心情和积极性也大大受到打击. ...

  2. python学习笔记:文件操作和集合(转)

    转自:http://www.nnzhp.cn/article/16/ 这篇博客来说一下python对文件的操作. 对文件的操作分三步: 1.打开文件获取文件的句柄,句柄就理解为这个文件 2.通过文件句 ...

  3. HIS与CIS的区别与联系

    医院的医疗信息系统总体可以分为两类:一类是关于医院管理运作的,另一类是关于临床医疗护理的,即面向医院管理和病人管理,前者被称为HIS(医院信息系统),后者被称为CIS(临床信息系统).HIS是以经济核 ...

  4. c++子类调用基类方法的一个例子

        Base.h #pragma once   class Base { public:     Base(void);     ~Base(void);     bool CreatClone( ...

  5. centos dns配置

    vi /etc/sysconfig/network-scripts/ifcfg-[tab两下] 新增以下修改 ONBOOT=yes  #开启自动启用网络连接 IPADDR0=192.168.21.12 ...

  6. laravel 数据库迁移

    问题:之前有创建迁移文件 并且执行过 如果删除迁移文件 再重新创建迁移文件时就有问题 提示找不到之前的迁移文件 /** 一开始执行的命令 php artisan make:migration crea ...

  7. flume远程调试

    项目开发的时候,出现问题的时候,通常在IDE里面直接进行调试,但有时候我们可能用的是另外的一些开源框架,甚至运行程序里面没有一行代码是我们自己写的,如果出现一些较复杂的问题,那么我们可能就会用到远程调 ...

  8. java 小知识

    public static void main(String[] args) { System.out.println( getMonthStart()); System.out.println( g ...

  9. NVelocity 表格行奇偶样式变换

    #foreach($test in $tests) #even <tr class="Test1"> #odd <tr class="Test2&quo ...

  10. 声明、定义 in C++

    序 声明和定义是我们使用的基础,但是对于声明和定义的概念,我们不甚了了,也就是说感觉好像是这样,但是真要详细说明就说不上来. 有博主对于声明和定义有以下描述:          1.需要建立存储空间的 ...