[1] 对象伪装法 (Object Masquerading)
对象伪装法实际是程序员为了实现继承的 Trick
继承:ClassB 继承 ClassA,注意 delete this.newMethod 的使用。
程序代码
/* ClassA 的原始定义 */
function ClassA(sColor) {
this.color = sColor;
this.sayColor = function(){
alert(this.color);
}
}
/* ClassB 的原始定义 */
function ClassB(sColor) {}
/* ClassB 定义2 */
function ClassB(sColor) {
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod; //删除对ClassA的引用,避免以后被调用
}
/* ClassB 定义3 */
function ClassB(sColor, sName) {
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;
this.name = sName;
this.sayName = function() {
alert(this.name);
}
}
[2] 多重继承
ClassZ继承自ClassX与ClassY
程序代码
function ClassZ() {
this.newMethod = ClassX;
this.newMethod();
delete this.newMethod;
this.newMethod = ClassY;
this.newMethod();
delete this.newMethod;
}
上述的实现有一个Gotcha,当ClassX与ClassY有同名的属性或方法时,因为ClassY后初始化,所以会覆盖掉ClassX的同名方法或属性。
[3] 使用call()方法实现
call()方法的第一参数为被当作This的对象,其他参数直接被传给funciton,通过使用Call(),我们也可以实现继承:
程序代码
function ClassB(sColor, sName) {
ClassA.call(this, sColor);
this.name = sName;
this.sayName = function() {
alert(this.name);
}
}
[4] 使用Apply()方法实现
Apply()方法只有两个参数,第一个与call()一样,被当作this;第二个是被传入function的参数数组,使用Apply()的好处是你可以使用function的arguments对象直接当作第二参数。
程序代码
function ClassB(sColor, sName) {
ClassA.apply(this, arguments); // 注:参数的顺序必须和ClassA定义的顺序一致
this.name = sName;
this.sayName = function() {
alert(this.name);
}
}
注意:如果使用arguments对象则需保证参数顺序与ClassA一致。
[5] 使用Prototype链
要求构造器不能有参数
程序代码
function ClassA() {}
ClassA.prototype.color = "red";
ClassA.prototype.sayColor = function() {
alert(this.color);
}
function ClassB(){}
ClassB.prototype = new ClassA();
ClassB.prototype.name = "";
ClassB.prototype.sayName = function() {
alert(this.name);
}
好处是可以使用instanceof,对对象进行判断,如果obj为ClassB对象,则instanceof ClassA和ClassB都会为true,这是使用伪装法所不具备的,但是prototype的构造器不能有参数。所以最好的方式是混合法。
[6] 使用混合法
程序代码
function ClassA(sColor) {
this.color = sColor;
}
ClassA.prototype.sayColor = function() {
alert(this.color);
}
function ClassB(sColor, sName) {
ClassA.call(this, sColor);
this.name = sName;
}
ClassB.prototype = new ClassA();
ClassB.prototype.sayName = function() {
alert(this.name);
}
但是混合法的缺点是无法多重继承。
[7] 动态原形法的一些问题
主要指xxx.protoype = new xxx() 不能被放在构造器里面,必须放在外面,可是如果要放在外面,那动态原形法本身就失去意义了,因为动态原形法本身就是为了把原形方法放在function的构造器里面,以使得代码风格接近Java。所以最好还是不要用动态原形法了。
[8] 利用其它通过工具库实现继承
xbObject(http://archive.bclary.com/xbProjects/)
Zinherit (Nicholas C. Zakas的库,Professional Javascript for web developer的作者)
分享到:
相关推荐
在JavaScript中继承是一个非常复杂的话题,比其他任何面向对象的语言中的继承都复杂得多。在大多数其他面向对象语言中,继承一个类只需使用一个关键字即可。与它们不同,在JavaScript中要想达到传承公用成员的目的,...
JavaScript继承的三种方法实例 继承 继承: 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承。 继承也是为了数据共享,js中的继承也是为了实现...
javascript控件开发之继承关系的源码
NULL 博文链接:https://yueyemaitian.iteye.com/blog/785325
浅析Javascript原型继承,浅析Javascript原型继承
在JavaScript中,每定义一个函数,就随之有一个对象存在,函数通过prototype属性指向该对象。这个对象称之为原型对象,简称原型。 6.6.1 原型 示例 function Student(){} console.log(typeof(Student.prototype)); /...
JavaScript Inheritance ...And you think you’re so clever ...JavaScript的原型继承比类继承有更强大的表现力,现在就让我们来看看。 Java JavaScript 强类型 弱类型 静态 动态 基于类 基于原型 类
JavaScript程序设计 面向过程与面向对象 6.1.1 面向过程与面向对象 1、概念 面向过程(Procedure Oriented)也可称之为“面向记录”,是一种以过程为中心的编程思想。它注重的是具体的步骤,只有按照步骤一步一步...
1.关于继承: 百度百科对继承的解释是:继承是指一个对象直接使用另一对象的属性和方法。 (话说百科对于计算机概念的继承的解释也太简略了) 继承的好处,优点学过面向对象的同学都知道,就不赘述了。 javascript中...
javascript继承之为什么要继承.docx
JavaScript中的继承之类继承_.docx
几乎每个开发人员都有面向对象语言(比如C++、C#、Java)的开发经验。...但是在JavaScript的世界中,所有的这一切特性似乎都不存在。 因为JavaScript本身不是面向对象的语言,而是基于对象的语言。
第3部分深入探索JavaScript,介绍了语法、值、运算符、布尔类型、数字、字符串、语句、异常捕获、函数、变量、对象与继承、数组、正则表达式、Date、Math、JSON、标准全局变量、编码和JavaScript、ECMAScript 5的新...
Douglas Crockford 在本书中剥开了JavaScript 沾污的外衣,抽离出一个具有更好可靠性、可读性和可维护性的JavaScript 子集,让你看到一门优雅的、轻量级的和非常富有表现力的语言。作者从语法、对象、函数、继承、...
Javascript继承机制原理 可以参考下
javascript中如何实现封装,继承和多态
javascript 五种继承简介。
JavaScript中的原型继承基础学习教程_.docx