/**

 * 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. 使用css Flexbox实现垂直居中

    CSS布局对我们来说一直是个噩梦,我们都认为flexbox是我们的救世主.是否真的如我们说说,还有待观察,但是flexbox确非常轻松的解决css长久一来比较难解决的居中问题.让我们来看看到底有多容易 ...

  2. Selenium WebDriver-判断页面中某一元素是否可操作

    driver.get("http://127.0.0.1/test_enable.html") i1=driver.find_element_by_id("input1& ...

  3. python学习-- 在for循环中还有很多有用的东西,如下:

    变量 描述 forloop.counter 索引从 1 开始算 forloop.counter0 索引从 0 开始算 forloop.revcounter 索引从最大长度到 1 forloop.rev ...

  4. python 时间、日期、时间戳的转换

    在实际开发中经常遇到时间格式的转换,例如: 前端传递的时间格式是字符串格式,我们需要将其转换为时间戳,或者前台传递的时间格式和我们数据库中的格式不对应,我们需要对其进行转换才能与数据库的时间进行匹配等 ...

  5. [python学习篇][廖雪峰][2]函数式编程

    函数名也是变量: >>> f = abs >>> f(-10) 10 然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就 ...

  6. 零基础自学用Python 3开发网络爬虫

    原文出处: Jecvay Notes (@Jecvay) 由于本学期好多神都选了Cisco网络课, 而我这等弱渣没选, 去蹭了一节发现讲的内容虽然我不懂但是还是无爱. 我想既然都本科就出来工作还是按照 ...

  7. 【bzoj4459】[Jsoi2013]丢番图 分解质因数

    题目描述 丢番图是亚历山大时期埃及著名的数学家.他是最早研究整数系数不定方程的数学家之一.为了纪念他,这些方程一般被称作丢番图方程.最著名的丢番图方程之一是x^N+y^n=z^N.费马提出,对于N&g ...

  8. HDU——4291A Short problem(矩阵快速幂+循环节)

    A Short problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  9. BZOJ3160 万径人踪灭 【fft + manacher】

    题解 此题略神QAQ orz po神牛 由题我们知道我们要求出: 回文子序列数 - 连续回文子串数 我们记为ans1和ans2 ans2可以用马拉车轻松解出,这里就不赘述了 问题是ans1 我们设\( ...

  10. 算法复习——树形dp

    树形dp的状态转移分为两种,一种为从子节点到父节点,一种为父节点到子节点,下面主要讨论子节点到父亲节点的情况: 例题1(战略游戏): 这是一道典型的由子节点状态转移到父节点的问题,而且兄弟节点之间没有 ...