原理:在子类的构造器上调用超类构造器(父类构造器中的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. -_-#Tiny Raytracer

    http://www.gabrielgambetta.com/tiny_raytracer.htmlhttp://gabrielgambetta.com/tiny_raytracer_full.js

  2. GeoServer基础教程(一):环境搭建篇

    转自:http://imxz.me/tech/3sdev/installation-of-geoserver.html GeoServer的是一个基于Java的软件,它允许用户查看和编辑地理空间数据, ...

  3. HDU1394-Minimum Inversion Number

    http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Ja ...

  4. Linux 单网卡多 IP 的配置方法

     Linux 单网卡多 IP 的配置方法 1 .永久配置的方法: 知道在 Linux 下网卡被称为 eth0,eth1,eth2..... ,所有网卡的配置文件都存储在 /etc/sysconfi ...

  5. 怎样安装Joomla 1.7网站系统

    http://jingyan.baidu.com/article/8065f87fc3de112331249830.html   如果你想使用Joomla(地球上最好的内容管理系统之一)搭建一个网站, ...

  6. Linux内核是如何创建一个新进程的?

    进程描述 进程描述符(task_struct) 用来描述进程的数据结构,可以理解为进程的属性.比如进程的状态.进程的标识(PID)等,都被封装在了进程描述符这个数据结构中,该数据结构被定义为task_ ...

  7. 关于升级linux下apache

    1:Check whether Apache is already installed. # rpm -qa | grep -i http httpd-tools-2.2.8-3.i386 httpd ...

  8. [学习笔记]设计模式之Singleton

    写在前面 为方便读者,本文已添加至索引: 设计模式 魔法手札索引 在前几篇笔记中,我们有了解了部分对象创建型模式,包括Builder(建造者).Abstract Factory(抽象工厂)和Facto ...

  9. PHP文件操作常用函数总结

    一 .解析路径: 1 获得文件名: basename(); 给出一个包含有指向一个文件的全路径的字符串,本函数返回基本的文件名.如果文件名是以 suffix 结束的,那这一部分也会被去掉. eg: $ ...

  10. c# 扩展方法奇思妙用集锦

    本文转载:http://www.cnblogs.com/ldp615/archive/2009/08/07/1541404.html 其中本人觉得很经典的:c# 扩展方法奇思妙用基础篇五:Dictio ...