无梦家园

无梦家园
posts - 21, comments - 151, trackbacks - 8, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

JavaScript的面向对象机理2)-继承

Posted on 2007-02-04 10:44 沧桑雨迢迢 阅读(2204) 评论(10)  编辑 收藏 网摘 所属分类: Javascript

一个继承机制可以有多简单?
   以下是一个最简单的实现继承基类属性和方法的示例:

<script type="text/javascript">
//声明继承自哪一个基类
Function.prototype.extend = function(baseClass){
    
this.baseClass = baseClass;
}

//初始化基类的属性(其实这个函数才具体实现"继承"基类属性和方法)
Function.prototype.initializeBase = function(){
    
if(typeof(this.baseClass) === 'undefined') return;    
    
var self = arguments[0];
    
if(!self) return;
    
this.baseClass.apply(self,arguments[1]);
}


//定义一个基类
function MyBase(name){
    
this.name = name;
    
this.showName = function(){
        alert(
this.name);
    }

}

//定义一个扩展类
function MyClass(name,age){
    MyClass.initializeBase(
this,[name]);//初始化基类
    this.age = age;
    
this.showAge = function(){
        alert(
this.age);
    }

}

MyClass.extend(MyBase);
//声明继承自MyBase

var m = new MyClass("fanrong",25);
m.showName();
m.showAge();
</script>
   这里对initializeBase方法的注释是"初始化基类",但其实initializeBase的更重要的功能是"继承"的具体实现.没有这个方法的调用,即使你用extend方法声明过了继承自哪一个类了,但是基类的属性在派生类中还是没有得到真正的"赋予".
   这种类的设计方式是依赖于JavaScript的动态属性扩展能力而实现的,因此这种方式的继承机制,不是在于"基类"与"派生类"之间的属性/方法继承,"派生类"其实与"基类"没关系,"派生类"只是通过extend而知道了自己的基类,具体的基类的属性和方法,要由被实例化的对象自己去基类的构造函数那获取.
   这种继承实现方式如果非要用一个比喻来形容的话,就仿佛是...应该是你的老板A直接付你工资,但是他不,他不乐意(我靠!).他说某老板B欠他钱,他有凭据(A.extend(B)),他要求你去找B要去(A.initializeBase(this)),幸好,B还算有信,二话不说给了你钱(B.apply(self,[...]).
   :)

真正的派生类与基类之间继承
   要实现真正的,派生类通过extend方法就完全获得基类的属性和方法,则必须依靠prototype,这也是类定义的两种方法之一.具体请看如下示例:
<script type="text/javascript">
Function.prototype.extend 
= function(baseClass){
    
for(var ptototypeName in baseClass.prototype){
        
if(typeof(this.prototype[ptototypeName]) === 'undefined'){
            
this.prototype[ptototypeName] = baseClass.prototype[ptototypeName];
        }

    }

}


function MyBase(name){    
}

MyBase.prototype 
= {
    name: 
null,
    showName: 
function(){
        alert(
this.name);
    }

}

function MyClass(name,age){    
    
this.name = name;
    
this.age = age;    
}

MyClass.prototype 
= {
    age: 
null,
    showAge: 
function(){
        alert(
this.age);
    }

}

MyClass.extend(MyBase);

var m = new MyClass("fanrong",25);
m.showName();
m.showAge();
</script>
   此时,MyClass在extend的时候,就从MyBase那完全获取了属性和方法(这些属性和方法定义在prototype上).因此,可以直接通过prototype的内建功能把属性和方法赋予MyClass所创建的实例上了.
   还是那个比喻...你的老板A幡然悔悟,他强烈要求即时付你工钱,决不让你自己去讨要第三方欠他的债...因此你就不同到B那跑一趟了,尽管B这人还是不错的...
   
继承机制的完美实现
   其实就是把上面的两种方法结合起来...
   如下:
<script type="text/javascript">
Function.prototype.extend 
= function(baseClass){
    
this.baseClass = baseClass;
    
for(var ptototypeName in baseClass.prototype){
        
if(typeof(this.prototype[ptototypeName]) === 'undefined'){
            
this.prototype[ptototypeName] = baseClass.prototype[ptototypeName];
        }

    }

}

Function.prototype.initializeBase 
= function(){
    
if(typeof(this.baseClass) === 'undefined') return;    
    
var self = arguments[0];
    
if(!self) return;
    
this.baseClass.apply(self,arguments[1]);
}


function MyBase(name,sex){    
    
this.name = name;
    
this.sex = !!sex;
    
this.showSex = function(){
        
if(!!sex){
            alert(
"");
        }
else{
            alert(
"");
        }

    }

}

MyBase.prototype 
= {
    name: 
null,
    showName: 
function(){
        alert(
this.name);
    }

}

function MyClass(name,age,sex){    
    MyClass.initializeBase(
this,[name,sex]);
    
this.age = age;    
}

MyClass.prototype 
= {
    age: 
null,
    showAge: 
function(){
        alert(
this.age);
    }

}

MyClass.extend(MyBase);

var m = new MyClass("fanrong",25,true);
m.showName();
m.showAge();
m.showSex();
</script>
   现在,你的老板A又改了策略.他顾及舆论的压力,直接付了你一点钱,另外一部分,还是要你去找欠他款的B要...ok,你可以去见B了,B还是很讲信用滴~~~当然你要祈祷没有欠B款的C,否则你会去找C的...一直......

Feedback

#1楼    回复  引用  查看    

2007-02-04 11:28 by Jeffrey Zhao      
很传统的方式,
还有一种做法,就是把基类的实例作为子类的prototype。
当然,不如现在这种好,不过可以比较一下。:)

#2楼    回复  引用  查看    

2007-02-04 14:23 by Hunts.C      
记下:)

#3楼 [楼主]   回复  引用  查看    

2007-02-04 14:52 by 沧桑雨迢迢      
en~~~

#4楼    回复  引用  查看    

2007-02-05 01:49 by Jeffrey Zhao      
对了,再提一下一些反射方法吧,比如确定某个对象是否为某个类的实例或者子类的实例。

#5楼    回复  引用  查看    

2007-02-05 09:41 by Icebird      
因此你就不同到B那跑一趟了

看得出来是用五笔的

#6楼    回复  引用    

2007-02-05 18:17 by 啊啊 [未注册用户]
我还会来了。。。。。。。。

期待你的文章

#7楼    回复  引用    

2007-02-27 11:36 by 注册香港公司 [未注册用户]
Oh Yeah
俺会天天来看你

知道我是谁不?



沧桑雨迢迢..................哈哈

#8楼 [楼主]   回复  引用  查看    

2007-02-27 12:57 by 沧桑雨迢迢      
不知道...

#9楼    回复  引用    

2007-09-18 13:09 by linjinxiao [未注册用户]
不错,大赞!

#10楼    回复  引用    

2007-10-30 19:39 by 11111 [未注册用户]
上海是一个非常美丽的城市,在美丽的城市上面注册一个自己的公司,去发展成一个和城市一样美丽的公司是每一个人的梦想。
在上海成立公司有,代表处、外资公司、内资公司、海外公司等形式。
1.http://www.perdoor.com代表处注册的定义是一种联络机构,是国外的公司在上海设立的公司。

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-02-04 10:46 编辑过
Google站内搜索

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》



相关文章:

相关链接: