#题记:

有一水果类,抽象出属性包括:name(水果品种),price(价格),id(ID号)。现有两个子类,分别为苹果,桔子,希望继承水果父类。

一、构造函数继承

构造函数继承相当把父类的属性在子类执行一遍(可以理解为复制一遍),代码如下:

        //父类:水果类
function Fruit(name, price, id) {
this.name = name;
this.price = price;
this.id = id;
}
//苹果类
function Apple(name, price, id) {
Fruit.call(this, name, price, id); //执行一遍父类的属性
}
//桔子类
function Orange(name, price, id) {
Fruit.call(this, name, price, id); //执行一遍父类的属性
}
var apple = new Apple('苹果', '10.5', '001'); //实例苹果,可以传参了
var orange = new Orange('桔子', '8.5', '002'); //实例桔子,可以传参了
console.log(apple.name);
console.log(orange.price);

二、构造函数解决的优点和缺点

一、优点

构造函数解决了原型继承中不能向父类传参的问题,它能灵活的向父类传送参数。并且继承的属性完全属于自己,不会和其它的子类产生影响。示例图:

二、缺点

构造函数继承不能继承父类的原型方法,参照这些条件,自然想到可以将它们组合一起。

三、组合继承

组合继承即是把原型继承构造函数继承组合一起。

示例代码如下

        //父类:水果类
function Fruit(name, price, id) {
this.name = name;
this.price = price;
this.id = id;
}
Fruit.prototype.getInfo=function()
{
console.log(this.name + ',' + this.price + ',' + this.id);
}
//苹果类
function Apple(name, price, id) {
Fruit.call(this, name, price, id); //执行一遍父类的属性
}
//桔子类
function Orange(name, price, id) {
Fruit.call(this, name, price, id); //执行一遍父类的属性
}
Apple.prototype = new Fruit(); //继承了父类的原型方法
Orange.prototype = new Fruit(); //继承了父类的原型方法 var apple = new Apple('苹果', '10.5', '001'); //实例苹果,传参
var orange = new Orange('桔子', '8.5', '002'); //实例桔子,传参
apple.getInfo(); //输出'苹果', '10.5', '001'
orange.getInfo(); //输出'桔子', '8.5', '002'

一、组合继承的优点和缺点

优点是:几乎很完美了,既能独立继承父类的属性,也能继承父类的原型方法。

缺点是:父类的构造函数执行了两遍,一次在call调用时,一次在原型继承时。

深入浅出javascript(十二)继承——构造函数继承和组合继承的更多相关文章

  1. 从头开始学JavaScript (十二)——Array类型

    原文:从头开始学JavaScript (十二)--Array类型 一.数组的创建 注:ECMAscript数组的每一项都可以保存任何类型的数据 1.1Array构造函数 var colors = ne ...

  2. javascript面向对象(二):构造函数的继承

    本文来自阮一峰 这个系列的第一部分,主要介绍了如何"封装"数据和方法,以及如何从原型对象生成实例. 今天要介绍的是,对象之间的"继承"的五种方法. 比如,现在有 ...

  3. 【Java学习笔记之二十二】解析接口在Java继承中的用法及实例分析

    一.定义 Java接口(Interface),是一系列方法的声明,是一些方法特征的集合,一个接口只有方法的特征没有方法的实现,因此这些方法可以在不同的地方被不同的类实现,而这些实现可以具有不同的行为( ...

  4. 读书笔记_Effective_C++_条款三十二:确定你的public继承继承塑模出is-a关系

    这一条款是说的是公有继承的逻辑,如果使用继承,而且继承是公有继承的话,一定要确保子类是一种父类(is-a关系).这种逻辑可能与生活中的常理不相符,比如企鹅是生蛋的,所有企鹅是鸟类的一种,直观来看,我们 ...

  5. 深入浅出javascript(二)函数和this对象

    一.函数对象的属性和方法 函数是一种数据类型,也是对象,这一点很明确.因此,函数对象也可以添加属性和方法,但是这里的属性和方法是静态的,之所以这样说,就是为了区别构造函数. 示例如下: ①创建一个空的 ...

  6. 轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(一)

    这一次我们深入的学习一下JavaScript面向对象技术,在学习之前,必要的说明一下一些面向对象的一些术语. 这也是全部面对对象语言所拥有的共同点.有这样几个面向对象术语: 对象 ECMA-262把对 ...

  7. javascript类继承系列四(组合继承)

    原理: 结合了原型链和对象伪装各自优点的方式,基本思路是:使用原型链继承原型上的属性和方法,使用对象伪装继承实例属性,通过定义原型方法,允许函数复用,并运行每个实例拥有自己的属性 function B ...

  8. 轻松学习JavaScript十二:JavaScript基于面向对象之创建对象(二)

    四原型方式 我们创建的每一个函数都有一个通过prototype(原型)属性.这个属性是一个对象,它的用途是包括能够由特定类型 的全部实例共享的属性和方法. 逻辑上能够这么理解:prototypt通过条 ...

  9. 《JAVASCRIPT高级程序设计》根植于原型链的继承

    继承是面向对象的语言中,一个最为津津乐道并乐此不疲的话题之一.JAVASCRIPT中的继承,主要是依靠原型链来实现的.上一篇文章介绍过,JAVASCRIPT中,每一个对象都有一个prototype属性 ...

  10. JS继承之借用构造函数继承和组合继承

    根据少一点套路,多一点真诚这个原则,继续学习. 借用构造函数继承 在解决原型中包含引用类型值所带来问题的过程中,开发人员开始使用一种叫做借用构造函数(constructor stealing)的技术( ...

随机推荐

  1. Python使用SMTP发送邮件(163,yeah等网易邮箱已测试可以)

    #! /usr/bin/env python# -*- coding: UTF-8 -*-import smtplibfrom email.mime.text import MIMETextmailt ...

  2. Gulp应用场景

    转自:Gulp教程之:Gulp能做什么,前端装逼为何要用它 我们先说说 平时web开发遇到的一些场景 和 苦恼无奈的情况:   JavaScript和CSS的版本问题 我们都知道 JavaScript ...

  3. PAT 1025 反转链表 (25)(STL-map+思路+测试点分析)

    1025 反转链表 (25)(25 分) 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4:如果K为4, ...

  4. hdu 2289 要二分的杯子

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2289 大意是 一个Cup,圆台形,给你它的顶部圆的半径,底部圆的半径,杯子的高度,和此时里面装的水的体 ...

  5. python imaplib无痕取信的主要

    typ, data = M.fetch(num, (UID BODY.PEEK[]))  

  6. [RF]怎样用Robot Framework写好Test Case?

    1.介绍 这是一个关于如何用Robot Framework写好Test Case的高层次的指导准则 怎样实际的与系统进行交互不在此文档范围内 最重要的准则是使测试用例尽可能的让熟悉此领域的人觉得简单易 ...

  7. c sharp multithreading

    1.  静态方法 using System; using System.Threading; namespace PlusThread { class Program { static void Ma ...

  8. tomcat 启动卡住不动的原因

    启动tomcat , 控制台停在这个地方不动了 [2018-10-10] 11:20:11.551 assets- [RMI TCP Connection(3)-127.0.0.1]-[Default ...

  9. Spring Boot学习笔记:JavaMailSender发送邮件

    项目中经常会有这样的需求,用户注册成功,需要给用户发送一封邮件.邮件需要有一定格式和样式.本次例子中用freemarker做样式,其他的模版引擎类似. 首先Spring Boot项目,项目结构如下 在 ...

  10. 如何使用putty远程连接linux

    如何使用putty远程连接linux | 浏览:5001 | 更新:2013-08-24 10:36 1 2 3 4 5 分步阅读 putty是一款超轻量级的运行在windows操作系统上的用于远程连 ...