javascript继承模型
2007-09-02 11:32
211 查看
前面介绍了javascript的对象模型,这里接着介绍javascript的继承模型,继承模型与对象模型相似,都不是java语言里面的那种语言内部的对象和继承,而是程序员依靠javascript的引用模型自己构造出来的与java语言里面的对象和继承在感官方面,使用方面,功能方面相似的一个效果.
这里着重提一下:
javascript除了五种基本类型外,其它类型全是引用类型,"引用"这个概念在这篇和上一篇"javascript对象模型"中起着非常重要的作用,一定要明确知道什么是引用类型.
下面我们开始:
javascript继承模型可由三个方式实现:
1.对象冒充
a.直接实现 例:
function ClassA(sColor) ...{
this.color = sColor;
this.sayColor = function () ...{
alert(this.color);
};
}
function ClassB(sColor, sName) ...{
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;
this.name = sName;
this.sayName = function () ...{
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
所有的新属性和新方法都必须在删除了新方法的代码行后定义,否则,可能会覆盖超类的相关属性和方法.
b.用Call()方法实现
function ClassA(sColor) ...{
this.color = sColor;
this.sayColor = function () ...{
alert(this.color);
};
}
function ClassB(sColor, sName) ...{
//this.newMethod = ClassA;
//this.newMethod(color);
//delete this.newMethod;
ClassA.call(this, sColor);
this.name = sName;
this.sayName = function () ...{
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
c.用Apply()方法实现
function ClassA(sColor) ...{
this.color = sColor;
this.sayColor = function () ...{
alert(this.color);
};
}
function ClassB(sColor, sName) ...{
//this.newMethod = ClassA;
//this.newMethod(color);
//delete this.newMethod;
ClassA.apply(this, arguments);
this.name = sName;
this.sayName = function () ...{
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
call()有点类似于java中的反射机制,b.call(a,c)用汉语描述可以这样理解:对象a调用b方法,c是b方法的参数.apply类似,不过apply第二个参数是一个数组.
2.原型链
原型链类似对象模型中,用原型实现对象,原理是一样的.关键用到了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);
};
var objA = new ClassA();
var objB = new ClassB();
objA.color = "red";
objB.color = "blue";
objB.name = "Nicholas";
objA.sayColor();
objB.sayColor();
objB.sayName();
子类的所有属性和方法都必须出现在prototype属性被赋值后,因为在它之前赋值的所有方法都会被删除,因为prototype属性被替换成了新对象,添加了新方法的原始对象将删除.原型链不支持多重继承,记住,原型链会用另一类型的对象重写类的prototype属性.
上面两种方法的缺点:
对象冒充的缺点是构造对象时必须使用构造函数方式,构造函数方式的缺点是:为所有的对象的所有属性和方法都建立一个副本,为对象的属性建立副本是没问题的,但为所有的方法也建立副本就没必要,这样会浪费内存,一个类的所有对象共享一个 方法的副本 就行了
原型链的缺点是:
建立对象是必须使用无参的构造函数,不能使用带参的构造函数.
基于上面两个原因,我们介绍第三种方法.
3.混合方式
混合方式类似于前面文章javascript对象类型的混合方式,用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法.例
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);
};
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
上面简单介绍了javascript的继承模型,其实javascript的继承模型不过是一个编程方式,思维模式的体现,用现有的一点条件,达到更多的效果.理解了其中的思维,原理,学习起来就能举一返三.
这里着重提一下:
javascript除了五种基本类型外,其它类型全是引用类型,"引用"这个概念在这篇和上一篇"javascript对象模型"中起着非常重要的作用,一定要明确知道什么是引用类型.
下面我们开始:
javascript继承模型可由三个方式实现:
1.对象冒充
a.直接实现 例:
function ClassA(sColor) ...{
this.color = sColor;
this.sayColor = function () ...{
alert(this.color);
};
}
function ClassB(sColor, sName) ...{
this.newMethod = ClassA;
this.newMethod(sColor);
delete this.newMethod;
this.name = sName;
this.sayName = function () ...{
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
所有的新属性和新方法都必须在删除了新方法的代码行后定义,否则,可能会覆盖超类的相关属性和方法.
b.用Call()方法实现
function ClassA(sColor) ...{
this.color = sColor;
this.sayColor = function () ...{
alert(this.color);
};
}
function ClassB(sColor, sName) ...{
//this.newMethod = ClassA;
//this.newMethod(color);
//delete this.newMethod;
ClassA.call(this, sColor);
this.name = sName;
this.sayName = function () ...{
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
c.用Apply()方法实现
function ClassA(sColor) ...{
this.color = sColor;
this.sayColor = function () ...{
alert(this.color);
};
}
function ClassB(sColor, sName) ...{
//this.newMethod = ClassA;
//this.newMethod(color);
//delete this.newMethod;
ClassA.apply(this, arguments);
this.name = sName;
this.sayName = function () ...{
alert(this.name);
};
}
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
call()有点类似于java中的反射机制,b.call(a,c)用汉语描述可以这样理解:对象a调用b方法,c是b方法的参数.apply类似,不过apply第二个参数是一个数组.
2.原型链
原型链类似对象模型中,用原型实现对象,原理是一样的.关键用到了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);
};
var objA = new ClassA();
var objB = new ClassB();
objA.color = "red";
objB.color = "blue";
objB.name = "Nicholas";
objA.sayColor();
objB.sayColor();
objB.sayName();
子类的所有属性和方法都必须出现在prototype属性被赋值后,因为在它之前赋值的所有方法都会被删除,因为prototype属性被替换成了新对象,添加了新方法的原始对象将删除.原型链不支持多重继承,记住,原型链会用另一类型的对象重写类的prototype属性.
上面两种方法的缺点:
对象冒充的缺点是构造对象时必须使用构造函数方式,构造函数方式的缺点是:为所有的对象的所有属性和方法都建立一个副本,为对象的属性建立副本是没问题的,但为所有的方法也建立副本就没必要,这样会浪费内存,一个类的所有对象共享一个 方法的副本 就行了
原型链的缺点是:
建立对象是必须使用无参的构造函数,不能使用带参的构造函数.
基于上面两个原因,我们介绍第三种方法.
3.混合方式
混合方式类似于前面文章javascript对象类型的混合方式,用对象冒充继承构造函数的属性,用原型链继承prototype对象的方法.例
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);
};
var objA = new ClassA("red");
var objB = new ClassB("blue", "Nicholas");
objA.sayColor();
objB.sayColor();
objB.sayName();
上面简单介绍了javascript的继承模型,其实javascript的继承模型不过是一个编程方式,思维模式的体现,用现有的一点条件,达到更多的效果.理解了其中的思维,原理,学习起来就能举一返三.
相关文章推荐
- 浏览器环境下的javascript DOM对象继承模型
- 浏览器环境下的javascript DOM对象继承模型
- 浅谈javascript的原型继承
- javaScript属性和方法同在构造函数中(包含继承)
- JavaScript学习笔记3-JavaScript中的继承
- 【面试必备】javascript的原型和继承
- javascript的原型和继承(1)
- 深入剖析JavaScript中的继承
- JavaScript是如何实现继承的(六种方式)
- C++对象模型:单继承,多继承,虚继承
- Ajax-Javascript-继承
- javascript的 继承
- Javascript继承4:洁净的继承者----原型式继承
- javascript 继承实现方法
- Javascript 原型和继承(Prototypes and Inheritance)
- JavaScript的原型继承详解
- javaScript 工作必知(七) 对象继承
- javascript继承之原型链(一)
- Javascript基于类的继承
- javascript prototype的深度探索不是原型继承那么简单第1/3页