javascript 面向?qū)ο?實(shí)現(xiàn)namespace,class,繼承,重載
更新時(shí)間:2009年10月29日 22:50:06 作者:
這幾天老大天天嚷嚷要重構(gòu)我們寫(xiě)的javascript,抱怨代碼太混亂,可讀性差,維護(hù)困難,要求javascript也按面對(duì)象的模型來(lái)重構(gòu)。
由于組里項(xiàng)目大多的javascript,css等客戶端工作是另一同事在負(fù)責(zé),該同事又特忙無(wú)法重構(gòu),老大也就只是提建議并未立即實(shí)施重構(gòu)。但是我前些日子也改過(guò)些許客戶端的小bug,確實(shí)那代碼看得讓人有些云里霧里,不知身在哪山,輕易不敢動(dòng)代碼,于是就自己動(dòng)手鼓搗起我曾又愛(ài)又恨的javascript來(lái),自己寫(xiě)一個(gè)簡(jiǎn)單的js實(shí)現(xiàn)namespace,繼承,重載等面向?qū)ο蟮奶匦?歡迎拍磚灌水
.定義namespace
Namesapce.js
Namespace = new Object();
Namespace.register = function(fullname){
try
{
var nsArray = fullname.split(".");
var strNS = "";
var strEval = "";
for(var i=0;i<nsArray.length;i++){
if(strNS.length >0)
strNS += ".";
strNS += nsArray[i];
strEval += " if(typeof("+ strNS +") =='undefined') " + strNS + " = new Object(); ";
}
if(strEval != "") eval(strEval);
}catch(e){alert(e.message);}
}
.Employee.js
Employee.js
//注冊(cè)命名空間
Namespace.register("MyCompany");
//1.類(lèi):雇員
MyCompany.Employee = function(empName){
this.Name = empName;
this.Salary = 1000;
this.Position = "cleaner";
}
MyCompany.Employee.prototype.ShowName = function(){
return "I'm "+this.Name+",my salary is $" + this.Salary;
}
MyCompany.Employee.prototype.Work = function(){
return "I'm a "+ this.Position +",I'm cleaning all day!"
}
//2.類(lèi):程序員
MyCompany.Developer = function(empName){
//繼承父類(lèi)屬性
MyCompany.Employee.call(this,empName);
//覆蓋父類(lèi)屬性
this.Position = "developer";
//擴(kuò)展屬性
this.Technology = "C#";
}
//繼承父類(lèi)原型方法
MyCompany.Developer.prototype = new MyCompany.Employee();
//覆蓋父類(lèi)方法
MyCompany.Developer.prototype.Work = function(){
return "I'm a "+ this.Position +",i'm good at "+ this.Technology +",i'm coding all day!"
}
測(cè)試代碼
<html>
<title>javascript 面向?qū)ο蟮膶?shí)現(xiàn) namespace,class,繼承,重載</title>
<head>
<script language="javascript" src="namespace.js" type="text/javascript"></script>
<script language="javascript" src="employee.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
function showEmployee(){
var emp = new MyCompany.Employee("xiaoming");
showInfo(emp);
}
function showDeveloper(){
var emp = new MyCompany.Developer("Gates");
showInfo(emp);
}
function showInfo(emp){
alert(emp.ShowName());
alert(emp.Work());
}
</script>
</head>
<body>
<input type="button" value="show employee info" onclick="showEmployee();"/><br/><br/>
<input type="button" value="show developer info" onclick="showDeveloper();"/>
</body>
</html>
源代碼打包下載
.定義namespace
Namesapce.js
復(fù)制代碼 代碼如下:
Namespace = new Object();
Namespace.register = function(fullname){
try
{
var nsArray = fullname.split(".");
var strNS = "";
var strEval = "";
for(var i=0;i<nsArray.length;i++){
if(strNS.length >0)
strNS += ".";
strNS += nsArray[i];
strEval += " if(typeof("+ strNS +") =='undefined') " + strNS + " = new Object(); ";
}
if(strEval != "") eval(strEval);
}catch(e){alert(e.message);}
}
.Employee.js
Employee.js
復(fù)制代碼 代碼如下:
//注冊(cè)命名空間
Namespace.register("MyCompany");
//1.類(lèi):雇員
MyCompany.Employee = function(empName){
this.Name = empName;
this.Salary = 1000;
this.Position = "cleaner";
}
MyCompany.Employee.prototype.ShowName = function(){
return "I'm "+this.Name+",my salary is $" + this.Salary;
}
MyCompany.Employee.prototype.Work = function(){
return "I'm a "+ this.Position +",I'm cleaning all day!"
}
//2.類(lèi):程序員
MyCompany.Developer = function(empName){
//繼承父類(lèi)屬性
MyCompany.Employee.call(this,empName);
//覆蓋父類(lèi)屬性
this.Position = "developer";
//擴(kuò)展屬性
this.Technology = "C#";
}
//繼承父類(lèi)原型方法
MyCompany.Developer.prototype = new MyCompany.Employee();
//覆蓋父類(lèi)方法
MyCompany.Developer.prototype.Work = function(){
return "I'm a "+ this.Position +",i'm good at "+ this.Technology +",i'm coding all day!"
}
測(cè)試代碼
復(fù)制代碼 代碼如下:
<html>
<title>javascript 面向?qū)ο蟮膶?shí)現(xiàn) namespace,class,繼承,重載</title>
<head>
<script language="javascript" src="namespace.js" type="text/javascript"></script>
<script language="javascript" src="employee.js" type="text/javascript"></script>
<script language="javascript" type="text/javascript">
function showEmployee(){
var emp = new MyCompany.Employee("xiaoming");
showInfo(emp);
}
function showDeveloper(){
var emp = new MyCompany.Developer("Gates");
showInfo(emp);
}
function showInfo(emp){
alert(emp.ShowName());
alert(emp.Work());
}
</script>
</head>
<body>
<input type="button" value="show employee info" onclick="showEmployee();"/><br/><br/>
<input type="button" value="show developer info" onclick="showDeveloper();"/>
</body>
</html>
源代碼打包下載
您可能感興趣的文章:
- JavaScript面向?qū)ο笾甈rototypes和繼承
- Javascript面向?qū)ο缶幊蹋ǘ?構(gòu)造函數(shù)的繼承
- 徹底理解js面向?qū)ο笾^承
- javascript 面向?qū)ο笕吕砭氈屠^承
- JS實(shí)現(xiàn)面向?qū)ο罄^承的5種方式分析
- Javascript面向?qū)ο缶幊蹋ㄈ?非構(gòu)造函數(shù)的繼承
- JS 面向?qū)ο笾^承---多種組合繼承詳解
- javascript 面向?qū)ο笕吕砭氈^承與多態(tài)
- javascript 面向?qū)ο蠓庋b與繼承
- javaScript面向?qū)ο罄^承方法經(jīng)典實(shí)現(xiàn)
- 《javascript設(shè)計(jì)模式》學(xué)習(xí)筆記二:Javascript面向?qū)ο蟪绦蛟O(shè)計(jì)繼承用法分析
相關(guān)文章
javascript 面向?qū)ο缶幊?聊聊對(duì)象的事
javascript是基于對(duì)象的編程語(yǔ)言。從window到document,從方法到類(lèi),從object到Array都是對(duì)象。2009-09-09JavaScript 基于原型的對(duì)象(創(chuàng)建、調(diào)用)
在我們寫(xiě)js代碼的時(shí)候,內(nèi)部對(duì)象是不可避免的要引用,但是光靠這些對(duì)象是不夠的,所以需要我們自己定義對(duì)象,這個(gè)時(shí)候通常用到的對(duì)象是第三種,即基于原型的對(duì)象,下面就如何創(chuàng)建自己的對(duì)象,定義對(duì)象的方法、屬性,調(diào)用對(duì)象給出詳細(xì)的說(shuō)明。2009-10-10討論javascript(一)工廠方式 js面象對(duì)象的定義方法
看《javascript高級(jí)程序設(shè)計(jì)》有感2009-12-12js面向?qū)ο笤O(shè)計(jì)用{}好還是function(){}好(構(gòu)造函數(shù))
js面向?qū)ο笤O(shè)計(jì)用{}好還是function(){}好,大家給予了回復(fù),感覺(jué)不錯(cuò),特分享給大家。2011-10-10js類(lèi)后臺(tái)管理菜單類(lèi)-MenuSwitch
js類(lèi)后臺(tái)管理菜單類(lèi)-MenuSwitch...2007-09-09JavaScript 常見(jiàn)對(duì)象類(lèi)創(chuàng)建代碼與優(yōu)缺點(diǎn)分析
這幾種javascript類(lèi)定義方式中,最常用的是雜合prototype/constructor 和 動(dòng)態(tài)prototype方式。2009-12-12JavaScript 三種創(chuàng)建對(duì)象的方法
JavaScript中對(duì)象的創(chuàng)建有以下幾種方式 使用內(nèi)置對(duì)象 使用JSON符號(hào) 自定義對(duì)象構(gòu)造。大家可以參考下。2009-10-10