/**

 * 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. loj2021 「HNOI2017」大佬

    there #include <algorithm> #include <iostream> #include <cstring> #include <cst ...

  2. oracle 控制文件的重建

    目录 oracle 控制文件的重建 NORESETLOGS RESETLOGS oracle 控制文件的重建 不到最后时刻,如三个控制文件都已损坏,又没有控制文件的备份.还是不要重建控制文件,处理不好 ...

  3. 01 Java 代码是怎么运行的

    Java代码运行的方式 1:在开发工具中运行 2:双击 jar 文件运行 3:在命令行中运行 4:在网页中运行 上述运行方式都离不开 JRE,也就是 Java 运行时环境.实际上 JRE 仅包含运行 ...

  4. Leetcode 451.根据字符出现频率排序

    根据字符出现频率排序 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入: "tree" 输出: "eert" 解释: 'e'出现两次 ...

  5. Uiautomator ---(1) 封装代码

    http://www.cnblogs.com/by-dream/p/4996000.html  上面是别人的写法 我自己的写法: package qq.test; import android.con ...

  6. hdu2094 stl之set的应用

    产生冠军 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  7. Codeforces 898E Squares and not squares

    题目大意 给定 $n$($n$ 是偶数,$2\le n\le 2\times 10^{5}$)个非负整数 $a_1,\dots, a_n$($a_i\le 10^9$). 要求将其中 $n/2$ 个数 ...

  8. [luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)

    传送门 很蒙蔽,不知道怎么搞. 网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学. 对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二 ...

  9. 浅谈android反调试之 签名校验

    反调试原理 很多时候,我们都需要进行修改修改应用程序的指令,然后重打包运行,重新打包就需要充签名. 利用签名的变化我们用于反调试.反调试实现代码如下: 为了更加隐藏,比较函数可能在SO层进行实现,如下 ...

  10. 【NOIP2016后记】

    身在浙江,又跪一年 你哪次正式比赛没跪??? 有的人初三联赛一等前途光明,比如衲姐,周驿东 有的人高一联赛一等为时未晚,比如MG,罗爷爷,陈冲 有的人高二联赛一等纵情声色,比如鸟爷爷,小鸡 有的人高三 ...