js类
引用:http://blog.csdn.net/ldl22847/article/details/4972604
面向对象的基础就是定义类,下面是定义一个类的例子,它有属性、方法、静态属性和静态方法。
例:
//一个js类
function JsTestClass(privatePara,publicPara)//构造函数
{
var priBl=privatePara;//私有变量
this.pubBl=publicPara; //公有变量
//定义私有方法
function priMethod()
{
return "priMethod()";
}
//定义公共方法,不能调用私有变量和方法
JsTestClass.prototype.pubMethod=function()
{
return "pubMethod()";
}
//定义特权方法,可访问所有成员
this.privilegedMethod=function()
{
var str="这个是特权方法,我被调用了/n";
str+="私有变量:"+priBl+"/n";
str+="公有变量:"+this.pubBl+"/n";
str+="私有方法:"+priMethod()+"/n";
str+="公共方法:"+this.pubMethod()+"/n";
return str;
}
}
//创建JsTestClass实例
var OneJsTest=new JsTestClass("私有变量成员","公有变量成员");
//alert(OneJsTest.priBl);//弹出:undefined
//alert(OneJsTest.pubBl);//弹出:公有变量成员。
//alert(OneJsTest.priMethod());//出错:对象不支持此属性或方法
//alert(OneJsTest.pubMethod());//弹出:pubMethod()
alert(OneJsTest.privilegedMethod());
/*
弹出:
这个是特权方法,我被调用了
私有变量:私有变量成员
公有变量:公有变量成员
私有方法:priMethod()
公共方法:pubMethod()
*/
//定义类的方式有很多种:
/*
============构造函数方式============
该方式在函数内部没有创建对象,是用this关键字,因为在调用构造函数时创建了对象,而在函数内容只能用this
来访问对象属性。
优点:可以根据参数来构造不同的对象实例。
缺点:构造时每个实例对象都会为对象创建自己的方法,造成了内存的浪费。
======================================
<summary>
房子类
</summary>
<param name="numDoor">有多少扇门</param>
<param name="numWindow">有多少个窗</param>
*/
function Houses(numDoor,numWindow)
{
this.numDr=numDoor;
this.numWd=numWindow;
this.getDrAdnWd=function()
{
return "这个屋子有"+this.numDr+"扇门,有"+this.numWd+"个窗<br>";
}
}
var h1=new Houses(1,6);
var h2=new Houses(2,8);
document.writeln(h1.getDrAdnWd()+h2.getDrAdnWd());
/*
输出:
这个屋子有扇门,有个窗
这个屋子有扇门,有个窗
*/
//当然你也可以用一个外部函数来代替类方法,达到了每个对象共享同一个方法。改写后的类如下:
function getDrAdnWd()
{
return "这个屋子有"+this.numDr+"扇门,有"+this.numWd+"个窗<br>";
}
function Houses(numDoor,numWindow)
{
this.numDr=numDoor;
this.numWd=numWindow;
this.getDrAdnWd=getDrAdnWd; //here
}
var h1=new Houses(1,6);
var h2=new Houses(2,8);
document.writeln(h1.getDrAdnWd()+h2.getDrAdnWd());
/*
输出:
这个屋子有扇门,有个窗
这个屋子有扇门,有个窗
*/
/*
============原型方式============
该方式利用了对象的prototype属性,可把它看成创建新对象所依赖的原型,
所有的属性和方法都被直接赋予prototype属性,使用原型方式时,不能通过给构造函数传递参数初始化属性的值
从语义上讲,所有属性看起来都属于一个对象。
优点:所有对象实例都共享同一个方法(相对于构造函数方式),没有造成内存浪费
缺点:不能通过参数来构造对象实例(一般每个对象的属性是不相同的)
======================================
<summary>
房子类
</summary>
<param name="numDoor">有多少扇门</param>
<param name="numWindow">有多少个窗</param>
*/
function Houses()
{
}
Houses.prototype.numDr="3";
Houses.prototype.numWd="9";
Houses.prototype.getDrAdnWd=function()
{
return "这个屋子有"+this.numDr+"扇门,有"+this.numWd+"个窗<br>";
}
var h1=new Houses();
var h2=new Houses();
document.writeln(h1.getDrAdnWd()+h2.getDrAdnWd());
/*
输出:
这个屋子有扇门,有个窗
这个屋子有扇门,有个窗
*/
//这意味必须在对象创建后才能改变属性的默认值,这点很令人讨厌,
//真正的问题出现在属性指向的是对象,而不是函数时,
//函数共享不会造成任何问题,但对象却很少被多个实例共享的,考虑下面的例子:
function Houses()
{
}
Houses.prototype.numDr="3";
Houses.prototype.numWd="9";
Houses.prototype.Include=new Array("砖头","门","窗");
Houses.prototype.getDrAdnWd=function()
{
return "这个屋子有"+this.numDr+"扇门,有"+this.numWd+"个窗<br>";
}
var h1=new Houses();
var h2=new Houses();
h1.Include.push("磁砖");
document.writeln(h1.Include+"<br>"+h2.Include);
/*
属性Include是指向Array对象的指针,由于Include是引用值,两个实例都指向同一个数组,
输出这两个指针中的任何一个,结果都是一样的
输出:
砖头,门,窗,磁砖
砖头,门,窗,磁砖
*/
/*
============构造函数+ 原型直接组装一个类============
======================================
<summary>
工具类
</summary>
<param name="constructor">构造函数</param>
<param name="prototype">方法</param>
*/
function $Class(constructor,prototype)
{
var c=constructor||{};
var p=prototype||{};
//c.prototype=p;
for(var arr in p)
{
c.prototype[arr]=p[arr];
}
return c;
}
//构造函数
function Houses(numDoor,numWindow)
{
this.numDr=numDoor;
this.numWd=numWindow;
}
//原型对象
var proto=
{
getDrAdnWd:function(){return "这个屋子有"+this.numDr+"扇门,有"+this.numWd+"个窗<br>";},
setDrAdnWd:function(numDoor,numWindow){this.numDr=numDoor,this.numWd=numWindow;}
}
//组装得到了两个同一个类型的类
var cnhs=$Class(Houses,proto);
var enhs=$Class(Houses,proto);
var h1=new cnhs(2,8);
var h2=new enhs(3,9);
document.writeln(h1.getDrAdnWd()+h2.getDrAdnWd());
/*
输出:
这个屋子有扇门,有个窗
这个屋子有扇门,有个窗
*/
/*
============构造函数+原型定义一个类============
======================================
<summary>
工具类
</summary>
<param name="constructor">构造函数</param>
<param name="prototype">方法</param>
*/
function $Class(constructor,prototype)
{
var c=constructor||{};
var p=prototype||{};
return function()
{
for(var arr in p)
{
/*
arguments表示传入函数的参数
callee表示函数和函数主体的语句
caller表示调用该函数的函数
*/
arguments.callee.prototype[arr]=p[arr];
c.apply(this,arguments);
}
}
}
//构造函数
function Houses(numDoor,numWindow)
{
this.numDr=numDoor;
this.numWd=numWindow;
}
//原型对象
var proto=
{
getDrAdnWd:function(){return "这个屋子有"+this.numDr+"扇门,有"+this.numWd+"个窗<br>";},
setDrAdnWd:function(numDoor,numWindow){this.numDr=numDoor,this.numWd=numWindow;}
}
//组装得到了两个同一个类型的类
var cnhs=$Class(Houses,proto);
var enhs=$Class(Houses,proto);
var h1=new cnhs(2,8);
var h2=new enhs(3,9);
document.writeln(h1.getDrAdnWd()+h2.getDrAdnWd());
/*
输出:
这个屋子有扇门,有个窗
这个屋子有扇门,有个窗
*/
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。