/**

 * js实现继承:

 * 1.基于原型链的方式

 * 2.基于伪造的方式

 * 3.基于组合的方式

 */

一、基于原型链的方式

function Parent(){

  this.pv = "parent"; 

}

Parent.prototype.showParentValue = function(){

  console.log(this.pv); 

}

function Child(){

  this.cv = "child"; 

}

//让Child的原型链指向Parent,也就等于完毕了一次继承

Child.prototype = new Parent();

Child.prototype.showChildValue = function(){

  console.log(this.cv); 

}

var c = new Child();

c.showParentValue(); //parent

c.showChildValue();  //child

/**

 *在使用原型链进行继承时,应注意下面问题:

 *1.不能在设定了原型链之后,再又一次为原型链赋值

 *2.一定要在原型链赋值之后才干加入或者覆盖方法

 */

 

 

 

使用原型链继承的缺点是:

1.无法从子类中调用父类的构造函数,

2.假设父类中存在引用类型。这个引用类型会加入到子类的原型中。假设一个对象改动了这个引用,其他对象的引用同一时候改动

所以一般都不会单纯的使用原型链来实现继承。

二、基于伪造的方式

function Parent(){

  this.color = ["red","blue"]; 

}

function Child(){

  //在Child中的this应该是指向Child的对象

  //在调用Parent方法的时候,并且this又指向了Child,就等于是:this.color = ["red","blue"];

  //也就等于在Child中有了this.color属性,这样也就变向的完毕了继承

  Parent.call(this); 

  //Parent(); 这样的调用方式,仅仅是完毕了函数的调用。根本无法实现继承

}

var c1 = new Child();

c1.color.push = "green";

console.log(c1.color);  //red,blue,green

var c2 = new Child();

console.log(c2.color);  //red,blue

//可是这依旧不太好,例如以下:

------------------------------------------------------------------------------

function Parent(name){

  this.color = ["red","blue"]; 

  this.name = name;

  

  /*this.say = function(){

     console.log(this.name);

  }*/

}

Parent.prototype.say = function(){

  console.log(this.name); 

}

function Child(name,age){

   /**

    * 使用伪造的方式就能够把子类的构造函数參数传递到父类中

    * 存在问题:

    *     1.因为使用的伪造方式。不会完毕Child的原型指向Parent,所以对Child来说say方法不存在

    * 解决方式:

    *     将这种方法放到Parent中,使用this来创建

    * 可是这又引起前面提到的问题:

    *     每一个Child对象都会有一个say,占用空间。所以也不应单独的使用伪造的方式实现继承。

    *     因此我们要使用组合的方式来解决问题

    */

  this.age = age;

  Parent.call(this,name); 

}

var c1 = new Child("Leon",13);

var c2 = new Child("Ada",22);

console.log(c1.name+","+c1.age);

console.log(c2.name+","+c2.age);

三、基于组合的方式

组合的方式是:属性通过伪造的方式实现。方法通过原型链的方式实现。

function Parent(name){

  this.color = ["red","blue"];

  this.name = name;

}                   

Parent.prototype.ps = function(){

  console.log(this.name+",["+this.color+"]"); 

}

function Child(name,age){

   this.age = age;

   Parent.call(this,name);

}

Child.prototype = new Parent();

Child.prototype.say = function(){

  console.log(this.name+","+this.age+",["+this.color+"]"); 

}

var c1 = new Child("Leon",22);

c1.color.push("green");

c1.say(); //Leon,22,[red,blue,green]

c1.ps();  //Leon,[red,blue,green]

var c2 = new Child("Ada",23);

c2.say(); //Ada,23,[red,blue]

c2.ps();  //Ada,[red,blue]

原创文章如转载。请注明出处,本文首发于csdn站点:http://blog.csdn.net/magneto7/article/details/25010555

js:深入继承的更多相关文章

  1. JS对象继承篇

    JS对象继承篇 ECMAScript只支持实现继承,而且其实现继承主要是依靠原型链来实现的 原型链 其基本思路是利用原型让一个引用类型继承另一个引用类型的属性和方法 function Person() ...

  2. js实现继承的5种方式 (笔记)

    js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...

  3. js实现继承的方式总结

    js实现继承的5种方式 以下 均为 ES5 的写法: js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承 ...

  4. 【09-23】js原型继承学习笔记

    js原型继承学习笔记 function funcA(){ this.a="prototype a"; } var b=new funcA(); b.a="object a ...

  5. js实现继承的两种方式

    这是面试时面试官会经常问到问题: js的继承方式大致可分为两种:对象冒充和原型方式: 一.先说对象冒充,又可分为3种:临时属性方式.call().apply(): 1.临时属性方式: 当构造对象son ...

  6. js实现继承

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

  7. 浅谈JS的继承

    JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...

  8. JS类继承常用方式发展史

    JS类继承常用方式发展史 涉及知识点 构造函数方式继承 1-继承单个对象 1.1 多步走初始版 1.2 多步走优化版 1.3 Object.create()方式 2-继承多个对象 2.1 遍历 Obj ...

  9. js实现继承的5种方式

    js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的继承机制,而是通过模仿实现的,根据js语言的本身的特性,js实现继承有以下通用的几种方式1.使用对象冒充实现继承(该种实现 ...

  10. JS原型继承与类的继承

    我们先看JS类的继承 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

随机推荐

  1. luogu3203 [HNOI2010]弹飞绵羊

    lct裸题 #include <iostream> #include <cstdio> using namespace std; int n, ski[200005], m, ...

  2. 模拟 - BZOJ 1510 [POI2006] Kra-The Disks

    BZOJ 1510 [POI2006] Kra-The Disks 描述 Johnny 在生日时收到了一件特殊的礼物,这件礼物由一个奇形怪状的管子和一些盘子组成. 这个管子是由许多不同直径的圆筒(直径 ...

  3. 28、editText只输入英文字母和'-',用于授权码输入

    InputFilter filter = new InputFilter() { @Override public CharSequence filter(CharSequence source, i ...

  4. SpringMVC 页面传递参数到controller的五种方式

    一共是五种传参方式: 一:直接将请求参数名作为Controller中方法的形参 public  String login (String username,String password)   : 解 ...

  5. shutil——高级的 文件、文件夹、压缩包 处理模块

    高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])复制文件内容(不包含元数据)从类文件对象src到类文件对dst.可选参数leng ...

  6. datatable 修改点击列头进行排序顺序

    一般点击排序时,是先升序后降序 可以通过如下代码修改排序规则 jQuery(function ($) { $(".datatable").dataTable({ "pag ...

  7. 一张图展示:用两个栈来实现一个队列,完成队列的Push和Pop操作

    一  基本思路 将s1作为存储空间,以s2作为临时缓冲区. 入队时,将元素压入s1. 出队时,将s1的元素逐个“倒入”(弹出并压入)s2,将s2的顶元素弹出作为出队元素,之后再将s2剩下的元素逐个“倒 ...

  8. PHP 教父鸟哥 Yar 的原理分析

    模块越来越多,业务越来越复杂,RPC 就上场了,在 PHP 的世界里,鸟哥的作品一直备受广大网友的青睐.下面一起学习下鸟哥的 PRC 框架 Yar . 揭开 Yar 神秘面纱 RPC 采用客户端/服务 ...

  9. ABP数据库的迁移

    添加表,一(Test)对多(Test1)关系 Test using Abp.Domain.Entities.Auditing; using System; using System.Collectio ...

  10. mq类----2

    手动应答方式 使用get my_consumer.php 消费者  生产者和上一篇 一样 <?php /** * Created by PhpStorm. * User: brady * Dat ...