/**

 * 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. [转] 重定向 CORS 跨域请求

    非简单请求不可重定向,包括第一个preflight请求和第二个真正的请求都不行. 简单请求可以重定向任意多次,但如需兼容多数浏览器,只可进行一次重定向. 中间服务器应当同样配置相关 CORS 响应头. ...

  2. 计算n的阶乘(n!)末尾0的个数

    题目: 给定一个正整数n,请计算n的阶乘n!末尾所含有“0”的个数. 举例: 5!=120,其末尾所含有的“0”的个数为1: 10!= 3628800,其末尾所含有的“0”的个数为2: 20!= 24 ...

  3. python-网络编程-02

    [1] server端 首先我们看下一个最简单http服务端 import socket def handle_request(client): buf = client.recv(1024) cli ...

  4. php isset()与empty()详解

    bool isset(mixed var);[;mixed var[,...]] 这个函数需要一个变量名称作为参数,如果这个变量存在,则返回true,否则返回false. 也可以传递一个由逗号间隔的变 ...

  5. JAVA调用oracle存储过程实例

    1.创建添加存储过程 CREATEORREPLACEPROCEDURE stu_proc(v_id INNUMBER, v_name INVARCHAR2, v_age INNUMBER) AS BE ...

  6. Welcome-to-Swift-12附属脚本(Subscripts)

    附属脚本 可以定义在类(Class).结构体(structure)和枚举(enumeration)这些目标中,可以认为是访问对象.集合或序列的快捷方式,不需要再调用实例的特定的赋值和访问方法.举例来说 ...

  7. python多进程(multiprocessing)

    最近有个小课题,需要用到双进程,翻了些资料,还算圆满完成任务.记录一下~ 1.简单地双进程启动 同时的调用print1()和print2()两个打印函数,代码如下: #/usr/bin/python ...

  8. HDU——2067小兔的棋盘(卡特兰数&递推DP)

    小兔的棋盘 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. Linux环境CentOS6.9安装配置Elasticsearch6.2.2最全详细教程

    Linux环境CentOS6.9安装配置Elasticsearch6.2.2最全详细教程 前言 第一步:下载Elasticsearch6.2.2 第二步:创建应用程序目录 第四步:创建Elastics ...

  10. CF 451E Devu and Flowers

    可重集的排列数 + 容斥原理 对于 \(\{A_1 * C_1, A _2 * C_2, \cdots, A_n * C_n\}\)这样的集合来说, 设 \(N = \sum_{i = 1} ^ n ...