您的位置:首页 > Web前端 > JavaScript

深入剖析JavaScript中的继承

2012-02-10 14:13 495 查看
JavaScript中的继承有以下几种方式:

一、对象冒充

function Parent(username) {
this.username = username;
this.hello = function() {
alert(this.username);
}
}

function Child(username, password) {
this.method = Parent;
this.method(username);
delete this.method;

this.password = password;
this.world = function() {
alert(this.password);
}
}

var p = new Parent("香雪海");
var c = new Child("宁采臣", "聊斋志异");

p.hello();
c.hello();
c.world();


二、使用call方法,call方法的第一个参数将作为调用call方法中函数的this

function Parent(username) {
this.username = username;
this.hello = function() {
alert(this.username);
}
}

function Child(username, password) {
Parent.call(this, username);

this.password = password;
this.world = function() {
alert(this.password);
}
}

var p = new Parent("香雪海");
var c = new Child("宁采臣", "聊斋志异");

p.hello();
c.hello();
c.world();

三、使用apply,与上一种类似

function Parent(username) {
this.username = username;
this.hello = function() {
alert(this.username);
}
}

function Child(username, password) {
//Parent.apply(this, new Array(username));
Parent.apply(this, [username]);
this.password = password;
this.world = function() {
alert(this.password);
}
}

var p = new Parent("香雪海");
var c = new Child("宁采臣", "聊斋志异");

p.hello();
c.hello();
c.world();


四、原型链方式

function Parent() {

}

Parent.prototype.username = "那一场风花雪月的故事";
Parent.prototype.hello = function() {
alert(this.username);
}

function Child() {

}

Child.prototype = new Parent();
Child.prototype.password = "恋爱I.N.G";
Child.prototype.world = function() {
alert(this.password);
}

var parent = new Parent();
var child = new Child();
parent.hello();
child.hello();
child.world();

五、混合方式(推荐)

function Parent(username) {
this.username = username;
}

Parent.prototype.hello = function() {
alert(this.username);
}

function Child(username, password) {
Parent.call(this, username);
//Parent.apply(this, new Array(username));
this.password = password;
}

Child.prototype = new Parent();
Child.prototype.world = function() {
alert(this.password);
}

var p = new Parent("尘间多少事");
var c = new Child("岂必消无踪", "未知尘缘是劫");

p.hello();
c.hello();
c.world();


下面是一个综合使用JavaScript面向对象和继承的小例子,有助于更深刻了解

function Shape(edge) {
this.edge = edge;
}

Shape.prototype.getArea = function() {
return 0;
}

Shape.prototype.getEdge = function() {
return this.edge;
}

function Triangle(bottom, height) {
Shape.call(this, 3);
this.bottom = bottom;
this.height = height;
}

Triangle.prototype = new Shape();
Triangle.prototype.getArea = function() {
return 0.5 * this.bottom * this.height;
}

function Rectangle(bottom, height) {
Shape.call(this, 4);
this.bottom = bottom;
this.height = height;
}

Rectangle.prototype = new Shape();
Rectangle.prototype.getArea = function() {
return this.bottom * this.height;
}

var triangle = new Triangle(10, 5);
alert(triangle.getEdge());//3
alert(triangle.getArea());//25

var rectangle = new Rectangle(10, 10);
alert(rectangle.getEdge());//4
alert(rectangle.getArea());//100

//利用反射机制和prototype实现继承
function class1(){
//构造函数
}
class1.prototype={
method:function(){
alert(1);
},
method2:function(){
alert("method2");
}
}
function class2(){
//构造函数
}
//让class2继承于class1
for(var p in class1.prototype){
class2.prototype[p]=class1.prototype[p];
}

//覆盖定义class1中的method方法
class2.prototype.method=function(){
alert(2);
}
//创建两个类的实例
var obj1=new class1();
var obj2=new class2();
//分别调用obj1和obj2的method方法
obj1.method();
obj2.method();
//分别调用obj1和obj2的method2方法
obj1.method2();
obj2.method2();

//为类添加静态方法inherit表示继承于某类
Function.prototype.inherit=function(baseClass){
for(var p in baseClass.prototype){
this.prototype[p]=baseClass.prototype[p];
}
}
//这里使用所有函数对象(类)的共同类Function来添加继承方法,这样所有的类都会有一个inherit方法,用以实//现继承,读者可以仔细理解这种用法。于是,上面代码中的:
//让class2继承于class1
for(var p in class1.prototype){
class2.prototype[p]=class1.prototype[p];
}
//可以改写为:
//让class2继承于class1
class2.inherit(class1)
//这样代码逻辑变的更加清楚,也更容易理解。通过这种方法实现的继承,有一个缺点,就是在class2中添加类成员//定义时,不能给prototype直接赋值,而只能对其属性进行赋值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: