如上次所述,,出于效率考虑,我们应该尽可能的将一些可重用的属性和方法添加到原型中去。

如果养成了这个好习惯,我们仅仅依靠原型就能顺利的完成继承关系的构建了。

毕竟采用new her()方法将her的属性设为对象自身属性,这样的代码是不可重用的,我们可以利用下述方法提高一些效率。这节的内容上文已经提到,毕竟温故知新也是很重要的。

  1. 不要单独为继承关系创建新对象。

  2. 尽量减少运行时的方式方式搜索(例如toString());

下面就是优化后的代码,修改的地方加粗显示(可能会与上文不太一样,其实也是一样的,都是相通的):

function her(){};
  her.prototype.name = 'Anna';
  her.prototype.toString = function(){
    return this.name;
}
function his(){};
  his.prototype = her.prototype;
  his.prototype.constructor = his;
  his.prototype.name = 'Jock';
function child(width, height){
    this.width = width;
    this.height = height;
}
child.prototype = his.prototype;
child.prototype.constructor = child;
child.prototype.name = 'clo';
child.prototype.doing = function(){
   return this.width * this.height / 2
}

测试结果依然相同:

var my = new child(10, 20); // 100my.toString(); // clo

我们来看一下,my对象在调用toString()方法时究竟内部发生了神马与之前不一样的事情,首先,javascript引擎会查看my对象有没有这个方法,显然没有,然后又会找child对象的原型prototype,此时child的原型属性已经指向了his的原型属性,而his的原型属性又指向了her的原型属性。更为重要的是,在这里的属性传递是引用传递而不是值传递。

这里已经有过去讲到的4步,变成了简单的两步了。

这样一来,从效率上来说是快了不少,但你有没有想过她有她的副作用。由于子对象和父对象指向的是同一个对象,一旦子对象对原型做出了修改,父对象也会修改,甚至所有的继承关系都会如此。

child.prototype.name = 'los';
var a = new her();
a.name; // los

所以,这种方法效率虽高,但不是任何场合都是适用的,即使用了这个方法,一定要留神那些同名的属性,是不是非常非常的累。。。。。。

javascript --- 只继承于原型的更多相关文章

  1. JavaScript之继承(原型链)

    JavaScript之继承(原型链) 我们知道继承是oo语言中不可缺少的一部分,对于JavaScript也是如此.一般的继承有两种方式:其一,接口继承,只继承方法的签名:其二,实现继承,继承实际的方法 ...

  2. Javascript之继承(原型链方式)

    1.原型链 原型链是JavaScript中继承的主要方法. 每个构造函数都拥有一个原型对象,原型对象都包含一个指向构造函数的指针(constructor),实例都包含一个指向原型对象的内部指针(__p ...

  3. javascript中继承(一)-----原型链继承的个人理解

    [寒暄]好久没有更新博客了,说来话长,因为我下定决心要从一个后台程序员转为Front End,其间走过了一段漫长而艰辛的时光,今天跟大家分享下自己对javascript中原型链继承的理解. 总的说来, ...

  4. javascript面向对象继承和原型

    一.理解什么是对象:任何东西都可以是对象,对象就是一组无序属性的集合 对象具有属性和方法1.1 属性的类型属性内部又定义了两种属性:数据属性和访问器属性 (1)数据属性:有4个描述的行为 Config ...

  5. javascript实现继承3种方式: 原型继承、借用构造函数继承、组合继承,模拟extends方法继承

    javascript中实现继承的三种方式:原型继承.借用构造函数继承.混合继承: /* js当中的继承 js中 构造函数 原型对象 实力对象的关系: 1 构造函数.prototype = 原型对象 2 ...

  6. JavaScript继承与原型链

    对于那些熟悉基于类的面向对象语言(Java 或者 C++)的开发者来说,JavaScript 的语法是比较怪异的,这是由于 JavaScript 是一门动态语言,而且它没有类的概念( ES6 新增了c ...

  7. JavaScript高级内容:原型链、继承、执行上下文、作用域链、闭包

    了解这些问题,我先一步步来看,先从基础说起,然后引出这些概念. 本文只用实例验证结果,并做简要说明,给大家增加些印象,因为单独一项拿出来都需要大篇幅讲解. 1.值类型 & 引用类型 funct ...

  8. 闲聊javascript继承和原型

    javascript继承已经是被说烂的话题了,我就随便聊一点~ 一.javascript的复制继承 javascript的继承有复制继承和原型继承,基于复制继承用的不太多,而且无法通过instance ...

  9. javascript精髓篇之原型链维护和继承.

    一.两个原型 很多人都知道javascript是原型继承,每个构造函数都有一个prototype成员,通过它就可以把javascript的继承演义的美轮美奂了. 其实啊,光靠这一个属性是无法完成jav ...

随机推荐

  1. wamp2.5 不能运行在win2003的解决方法

    安装时提示 httpd.exe 不是有效的 win32程序 之后就启动不了,连小icon都不显示了 经查发现 wampserver 2.5用 vc11编译,并使用了他的类库 vc11是不支持 xp和 ...

  2. WebKit内核分析之FrameLoader

    参考地址:http://blog.csdn.net/dlmu2001/article/details/6168545 FrameLoader类负责一个Frame的加载,在Frame的流程中起到非常重要 ...

  3. Linux 时钟与计时器

    对 Linux 系统来说,时钟和计时器是两个十分重要的概念.时钟反应的是绝对时间,也可认为是实时时间.计时器反应的则是相对时间,即相对于系统启动后的计时.操作系统内核需要管理运行时间(uptime)和 ...

  4. Android学习笔记之ConnectivityManager+NetWorkInfo

    PS:眼看就要开学了,该收收心了. 学习内容: 1.ConnecivityManager 2.NetWorkInfo   ConnectivityManger:网络连接管理者,用于管理Android设 ...

  5. SQL Server 2014里的IO资源调控器

    在本文中,我们将来看看SQL Server 2014在资源调控器方面增加了哪些新的功能.资源调控器(Resource Governor)是从SQL Server 2008开始出现的一项功能.它是用于管 ...

  6. stl的优先级队列

    #include <iostream> #include <vector> #include <queue> using namespace std; class ...

  7. C# 获取磁盘空间大小的方法

    方法一:利用System.IO.DriveInfo.GetDrives方法来获取 /// /// 获取指定驱动器的空间总大小(单位为B) /// /// 只需输入代表驱动器的字母即可 (大写) /// ...

  8. CentOS6.5菜鸟之旅:安装VirtualBox4.3

    一.下载VirtualBox的RHEL软件库配置文件 cd /etc/yum.repos.d wget http://download.virtualbox.org/virtualbox/rpm/rh ...

  9. JS魔法堂:追忆那些原始的选择器

    一.前言                                                                                                 ...

  10. [ASP.NET] 使用 ASP.NET SignalR 添加实时 Web

    ASP.NET SignalR 是为 ASP.NET 开发人员提供的一个库,可以简化开发人员将实时 Web 功能添加到应用程序的过程.实时 Web 功能是指这样一种功能:当所连接的客户端变得可用时服务 ...