原理:在子类的构造器上调用超类构造器(父类构造器中的this指向子类实例),js提供了apply()和call()函数,可以实现这种调用

function baseClass() { this.colors = ['red', 'blue']; }
//在子类构造器调用父类构造器
function childClass() { baseClass.call(this); }
var instanse1 = new childClass();
var instanse2 = new childClass();
instanse2.colors.push('green');
var instanse3 = new childClass();
alert(instanse1.colors);//red,blue
alert(instanse2.colors);//red,blue,green
alert(instanse3.colors);//red,blue
//结果是:即使对某个继承的实例进行修改,对其他实例也没影响,核心是子类构造器的 call()执行,与之相同功能的还有apply()
// 二者作用:
// js每个funciton都有call和apply方法,call函数的功能是在指定的对象上执行函数,它的第一个参数就是指定的对象,还可以有多个参数,除第一个参数之外,其他参数都是指定对象所需的参数
function fun(x, y) { this.pointX = x; this.pointY = y;}
var dot = {};
fun.call(dot, 10, 20);
alert(dot.pointX);
alert(dot.pointY);
其中fun.call(dot,10,20);使dot具有了fun的属性,意思是在dot上运行fun(),在运行时,fun中的this指向dot,同时向fun()传递了两个参数,
apply与call功能相同,但是调用形式不同

//使用apply调用
fun.apply(dot, [30, 40]);
alert(dot.pointX);
alert(dot.pointY);

fun()调用所需的参数以数组形式传递给形参了,再参数不确定用apply最合适了
所以如果函数传递参数是固定的,用call或者apply都可以,如果不固定用apply()

function fun2(x, y, z) {
x = x || 0;
y = y || 0;
z = z || 0;
var list = [];
list.push(x);
list.push(y);
list.push(z);
alert(list);
}
fun2(1, 2, 3);
function fun1() { fun2.apply(this, arguments); }
fun1(10);
fun1(10, 20);
fun1(10, 20, 30);

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

function BaseClass(n, g) {
this.Name = n;
this.Gender = g;
this.getName = function () { return this.Name;}
}
BaseClass.prototype.GetGender = function () { return this.Gender; }
function ChildClass(n, g, m) {
BaseClass.call(this, n, g);
this.age = m;
}
ChildClass.prototype.GetAge = function () { return this.age; }
var instanse1 = new ChildClass('a', 'M', 20);
alert(instanse1.getName());
alert(instanse1.GetAge());
alert(instanse1.GetGender());//报错
//GetGender未被继承,说明仅靠构造函数实现继承不可靠,应该使用原型
//getName()是定义在构造函数里面的,意味着每次创建父类对象或者子类对象,这个方法都就会被重复创建一遍,而这种重复工作,是我们应该避免的,很多时候,我们将属性定义在构造器里面,将方法定义在原型对象上,
因为每个对象拥有不同的属性,但拥有相同的方法,

javascript类继承系列三(对象伪装)的更多相关文章

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

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

  2. javascript类继承系列五(其他方式继承)

    除了前面学习的三种继承外,还有另外三种:原型继承寄生继承,寄生组合继承都是以: function object(o) { function F() { } F.prototype = o; retur ...

  3. javascript类继承系列二(原型链)

    原型链是采用最主要的继承方式,原理:每一个类(构造器,js中的function)都有一个原型属性(prototype)指向一个原型对象,原型对象有一个构造器(constructor),它又指回到fun ...

  4. javascript类继承系列一

    js中没有提供类(class,抽象类,接口等高级的抽象),可以用new,但new的function的对象,构造器 但在js中可以通过function来模拟类的一些特性function fun_name ...

  5. JavaScript类继承, 用什么方法好

    JavaScript类继承, 用什么方法好 一个实例: 基类Car: function Car(color, year) { this.name = "car"; this.col ...

  6. 实现JavaScript中继承的三种方式

    在JavaScript中,继承可以通过三种手法实现原型链继承 使用apply.call方法 对象实例间的继承.     一.原型链继承 在原型链继承方面,JavaScript与java.c#等语言类似 ...

  7. javascript类继承的一些实验

    其实一开始编js没怎么用过对象,一般都用func,func,func···但是用多了,感觉代码一点都不美观,还要这里包一个函数,那里包一个函数,或者一直都是函数调用,不好看,而且一些重用的都要重写的话 ...

  8. Javascript类继承-机制-代码Demo【原创】

    最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...

  9. C++中的类继承(1) 三种继承方式

    继承是使代码可以复用的重要手段,也是面向对象程序设计的核心思想之一.简单的说,继承是指一个对象直接使用另一对象的属性和方法.继承呈现了 面向对象程序设 计的层次结构, 体现了 由简单到复杂的认知过程. ...

随机推荐

  1. 【转】Mac 下钥匙串不能授权访问怎么解决--不错

    原文网址:https://www.v2ex.com/t/240495 如题,之前都好好的,后来有次 xcode 打包 app 时弹出提示框要授权,我点击允许和始终允许都没反映,点拒绝就可以,刚才安装 ...

  2. jQuery选择器上下文

  3. (转载)Linux下IPTABLES防火墙的设定

    (转载)http://www.jefflei.com/post/1760.html 1.iptables防火墙启动和停止 启动iptables防火墙时命令行输入 #service iptables s ...

  4. HTML5 Canvas核心技术—图形、动画与游戏开发.pdf4

    CanvasRenderingContext2D对象中用于平移.旋转坐标系的方法 镜像 scale(1,-1)绘制垂直镜像:scale(-1,1)绘制水平镜像 自定义的坐标变换 transform() ...

  5. Yslow 之 高性能网站建设指南(High.Performance.Web.Sites)

    一个朋友做了2年前端重构,不知道 YSLOW.我推荐给他的时候,他惊呼这工具很强大. YSLOW 只是 Yahoo 前端发布的一个评测网站前端质量的插件.它的原理是基于 Yahoo 前端工程师提出来的 ...

  6. 399. Evaluate Division

    图像题,没觉得有什么简单的办法,貌似可以用Union Find来解. 感觉有2种思路,一种是先全部构建好每2个点的weight,然后直接遍历queires[][]来抓取答案. 一种是只构建简单的关系图 ...

  7. 第一次JAVA基础考试后的反思

    今天进行了第一次JAVA基础考试,考查了课本上前面三章和方法的知识,基本没有涉及到数组.通过这次的考试,暴露了自己在学习中的很多问题. 机试题是编写一个学员状态转换器,主要运用的是选择语句和方法,而没 ...

  8. 网易云音乐 歌词制作软件 BesLyric

    导读 哈哈,喜欢网易云音乐,又愁于制作歌词的童鞋有福啦! BesLyric 为你排忧解难! 上个周末在用网易云音乐听歌,发现一些喜欢的歌还没有滚动歌词,然而网易云音乐还没有自带的歌词编辑功能,要制作歌 ...

  9. 调试postgresql9.5.2最新源码

    最近在考量数据库的选型,考虑后期把数据切换到postgresql ,postgresql源码用c实现,代码很精炼完美,值得学习下 首先去pgsql官网下载最新的源码 ,然后还需要perl,bison ...

  10. CAS SSO:汇集配置过程中的错误解决方法

    本教程为gevin.me原创文章,转载请注明: CAS SSO:配置过程中的错误解决方法 | Gevin’s Blog 本文将收集在配置CAS SSO遇到的所有错误,希望对大家有帮助,也方便下次搭建的 ...