无为清净楼资源网 Design By www.qnjia.com
谈JavaScript的面向对象设计有点牵强,毕竟JavaScript语言本身没有高级语言严谨。看这篇文章之前,希望大家了解c++、java、c#等高级语言,有面向对象编程的基础知识。
1.类的定义:
function ClassName(){
}
大家可以发现类的定义形式是和函数是一样的。
其实函数和类只有在使用的时候才能分辨出来,比如我们在一个页面中分别使用他们:
<script language="javascript">
function A(){
alert('hello');
}
//A作为函数来使用
A();
//A作为类来使用,从类A派生出一个obj对象
var obj=new A();
</script>
2.类的成员:
function ClassName(){
//定义公有变量
this.property1=0;
//定义公有方法
this.method1=function(){
//判断this.a是否赋值
if(this.a != undefined)
alert(this.a);
}
//另外一种方法的定义形式
this.method3=funcA;
//定义私有成员
var pram1=1;
var method2=function(){
alert('');
}
}
//funcA是方法method3的处理函数
function funcA(){
alert('');
}
上面的代码慢慢来给大家解释:
有this开头的都是类的成员,而且都是公有(public)的。
比如:property1是类的属性、method1是类的方法;
类的成员不需要使用var来定义,没有使用this前缀的都是私有变量。
比如:pram1是私有变量,method2是私有方法;
类的属性可以不在类中定义,不要初始化的属性可以不定义,在其他地方仍可以调用;
比如:在method1里面要输出a属性,在整个类里面就没有定义a属性,我们在创建对象的时候可以给它赋值。
var obj=new ClassName()
obj.a="hello javascript";
obj.method1();
类的方法可以通过this.method=function(){}来定义,比如method1方法;
也可以通过this.method=funcName来定义,将方法指定让某个函数来处理,比如method3;
3.类的继承:
function classA(){
this.property1='hello';
this.method1=function (){
alert(this.property1);
}
}
function classB(){
}
//继承classA
classB.prototype=new classA();
//给classB添加PI属性
classB.prototype.PI=3.1415926;
//给classB添加showPI方法
classB.prototype.showPI=function(){
alert(this.PI);
}
通过使用prototype对象,将类classA的实例赋值给prototype对象,从而classB继承了classA的所有成员;
比如:classB.prototype=new classA();
同时也可以通过prototype在类外给类从新添加成员(这个是别的高级语言所没有的功能);
比如:classB.prototype.PI和classB.prototype.showPI
4.类方法的重载:
类方法的重载在类的构造函数中使用的比较多,比如:类中有两个同名的方法而不同参数或不同参数类型。JavaScript从形式上来说不支持类方法重载,我们可以通过它的arguments属性来完成对类方法的重载:
function classA(){
//获取参数个数
//注意this.arguments.length是错误的
var num=classA.arguments.length;
this.method1=function(){
if(num==0){
alert(0);
}
if(num==1){
alert(1);
}
}
}
类或函数名的arguments属性返回一个数组包含所有参数;
比如:classA.arguments.length可以获取参数的个数,classA.arguments[0]获取第一个参数的值
根据需要,通过获取参数个数或参数值,从而同一个函数或类具有了不同的功能,比如:
var obj= new classA();
obj.method1();//输出了0
var obj1= new classA(5);
obj1.method1();//输出了1
5.对象的定义:
//对象是类的实例,定义一个类,作为一个对象的模板
function A(){
this.a=1;
this.b=2;
this.add=function(){
return this.a+this.b;
}
}
//定义一个对象
var obj=new A();
//赋值类属性
obj.a=5;
obj.b=6;
//调用类方法
var sum=obj.add();
另外一种定义方法:
var obj={
a:1,
b:2,
add:function(){
return this.a + this.b;
}
}
这种方法定义的对象,把其类的结构也一起定义了,适合只使用一次的类
定义属性和方法的时候不需要使用this关键字,":"后直接赋值即可
但是方法中使用属性,需要使用this关键字
本文只是本人个人的经验和理解,估计我写的和一些书上有些不一样,相信看了之后一定能很快理解。此文章只起到抛砖引玉之作用,具体的项目需求还要具体对待。涉及所有例子均亲自调试无误,如有错误请指正。
1.类的定义:
function ClassName(){
}
大家可以发现类的定义形式是和函数是一样的。
其实函数和类只有在使用的时候才能分辨出来,比如我们在一个页面中分别使用他们:
<script language="javascript">
function A(){
alert('hello');
}
//A作为函数来使用
A();
//A作为类来使用,从类A派生出一个obj对象
var obj=new A();
</script>
2.类的成员:
function ClassName(){
//定义公有变量
this.property1=0;
//定义公有方法
this.method1=function(){
//判断this.a是否赋值
if(this.a != undefined)
alert(this.a);
}
//另外一种方法的定义形式
this.method3=funcA;
//定义私有成员
var pram1=1;
var method2=function(){
alert('');
}
}
//funcA是方法method3的处理函数
function funcA(){
alert('');
}
上面的代码慢慢来给大家解释:
有this开头的都是类的成员,而且都是公有(public)的。
比如:property1是类的属性、method1是类的方法;
类的成员不需要使用var来定义,没有使用this前缀的都是私有变量。
比如:pram1是私有变量,method2是私有方法;
类的属性可以不在类中定义,不要初始化的属性可以不定义,在其他地方仍可以调用;
比如:在method1里面要输出a属性,在整个类里面就没有定义a属性,我们在创建对象的时候可以给它赋值。
var obj=new ClassName()
obj.a="hello javascript";
obj.method1();
类的方法可以通过this.method=function(){}来定义,比如method1方法;
也可以通过this.method=funcName来定义,将方法指定让某个函数来处理,比如method3;
3.类的继承:
function classA(){
this.property1='hello';
this.method1=function (){
alert(this.property1);
}
}
function classB(){
}
//继承classA
classB.prototype=new classA();
//给classB添加PI属性
classB.prototype.PI=3.1415926;
//给classB添加showPI方法
classB.prototype.showPI=function(){
alert(this.PI);
}
通过使用prototype对象,将类classA的实例赋值给prototype对象,从而classB继承了classA的所有成员;
比如:classB.prototype=new classA();
同时也可以通过prototype在类外给类从新添加成员(这个是别的高级语言所没有的功能);
比如:classB.prototype.PI和classB.prototype.showPI
4.类方法的重载:
类方法的重载在类的构造函数中使用的比较多,比如:类中有两个同名的方法而不同参数或不同参数类型。JavaScript从形式上来说不支持类方法重载,我们可以通过它的arguments属性来完成对类方法的重载:
function classA(){
//获取参数个数
//注意this.arguments.length是错误的
var num=classA.arguments.length;
this.method1=function(){
if(num==0){
alert(0);
}
if(num==1){
alert(1);
}
}
}
类或函数名的arguments属性返回一个数组包含所有参数;
比如:classA.arguments.length可以获取参数的个数,classA.arguments[0]获取第一个参数的值
根据需要,通过获取参数个数或参数值,从而同一个函数或类具有了不同的功能,比如:
var obj= new classA();
obj.method1();//输出了0
var obj1= new classA(5);
obj1.method1();//输出了1
5.对象的定义:
//对象是类的实例,定义一个类,作为一个对象的模板
function A(){
this.a=1;
this.b=2;
this.add=function(){
return this.a+this.b;
}
}
//定义一个对象
var obj=new A();
//赋值类属性
obj.a=5;
obj.b=6;
//调用类方法
var sum=obj.add();
另外一种定义方法:
var obj={
a:1,
b:2,
add:function(){
return this.a + this.b;
}
}
这种方法定义的对象,把其类的结构也一起定义了,适合只使用一次的类
定义属性和方法的时候不需要使用this关键字,":"后直接赋值即可
但是方法中使用属性,需要使用this关键字
本文只是本人个人的经验和理解,估计我写的和一些书上有些不一样,相信看了之后一定能很快理解。此文章只起到抛砖引玉之作用,具体的项目需求还要具体对待。涉及所有例子均亲自调试无误,如有错误请指正。
标签:
JavaScript,面向对象
无为清净楼资源网 Design By www.qnjia.com
广告合作:本站广告合作请联系QQ:858582 申请时备注:广告合作(否则不回)
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
无为清净楼资源网 Design By www.qnjia.com
暂无评论...
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
2024年11月16日
2024年11月16日
- 张敬轩2005《我的梦想我的路》几何娱乐[WAV+CUE][1G]
- 群星《人到四十男儿情(SRS+WIZOR)》[原抓WAV+CUE]
- 马久越《上善若水HQCDII》[低速原抓WAV+CUE]
- 龚玥《女儿情思》6N纯银SQCD【WAV+CUE】
- 张惠妹《你在看我吗》大碟15 金牌大风[WAV+CUE][1G]
- 群星《左耳·听见爱情》星文唱片[WAV+CUE][1G]
- 群星《抖音嗨疯-DISCO英文版》[WAV+CUE][1G]
- 群星.1990-情义无价(TP版)【中唱】【WAV+CUE】
- 马兆骏.1990-心情·七月【滚石】【WAV+CUE】
- 方伊琪.1979-沙鸥(LP版)【星岛全音】【WAV+CUE】
- 蔡琴《醇厚嗓音》6N纯银SQCD【WAV+CUE】
- 陈曦《遇见HQCD》[WAV+CUE]
- 大提琴-刘欣欣《爱的问候》HDCD[WAV+CUE]
- 周耀辉/邓慧中《从什么时候开始》[320K/MP3][95.71MB]
- 周耀辉/邓慧中《从什么时候开始》[FLAC/分轨][361.29MB]