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

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

毕竟采用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. DiskGenius无损调整分区大小

    一般情况下,调整分区的大小,通常都涉及到两个或两个以上的分区.比如,要想将某分区的大小扩大,通常还要同时将另一个分区的大小缩小:要想将某个分区的大小缩小,则通常还要同时将另一个分区的大小扩大.    ...

  2. CLR via C#深解笔记六 - 泛型

    面向对象编程一个好处就是“代码重用”,极大提高了开发效率.如是,可以派生出一个类,让它继承基类的所有能力,派生类只需要重写虚方法,或添加一些新的方法,就可以定制派生类的行为,使之满足开发人员的需求. ...

  3. Part 1: Running Oracle E-Business Suite on Oracle Cloud

    You can now run Oracle E-Business Suite on Oracle Cloud.  EBS customers can take advantage of rapid ...

  4. ubuntu 搭建 samba 服务器

    . sudo apt-get install samba samba-common . sudo vi /etc/samba/smb.conf [alair's share] path = /home ...

  5. Eclipse项目名出现红叉

    一.背景与原因 项目第一次加进来的时候,我用的是D:\Java\jdk1.7.0_17,后来由于配置将tomcat切换到jboss,说是JBOSS某个版本只支持jdk6,我就将“环境变量JAVA_HO ...

  6. UIView 与 CALayer

    联系: 1. UIView 有个属性 layer,可以返回它的主 CALayer 实例:CALayer *layer = myView.layer 2. 一个 UIView 可以有多个 CALayer ...

  7. CSS 布局属性(display,float,clear,visibility,overflow,overflow-x,overflow-y)

    display:none | inline | block | list-item | inline-block | table | inline-table | table-caption | ta ...

  8. C++ Web Service SDK

    https://github.com/zaphoyd/websocketpp https://github.com/aws/aws-sdk-cpp

  9. C#调用Java类

    C#调用Java类 (2011-01-07 14:02:05) 转载▼   分类: Java学习  1. 在Eclipse中新建名称为hello的java project,此工程仅包含一个文件hell ...

  10. 利用__index和__newindex实现默认值表、监控表、只读表

    __index和__newindex实际上相当于是在读写表的时候分别加了一道过滤的逻辑,让读写表的操作可以被监控或说回调,利用这个特性可以实现一些带有特殊功能的表. 带有默认值的表: setdefau ...