js面向对象编程-高级内容
JavaScript面向对象
一、为每个对象动态添加属性或方法
功能:返回对象类型原型的引用
- prototype的使用
格式:class.prototype
场景:
比如说:A写了一个类,交给B,B在使用时发现A写的类的功能有所欠缺,但是B没有权力改写A的文件,这时该怎么办?
Function Person(name1,age1){
This.name=name1;
This.age=age1;
}
Var p1=new Person(‘zhangsan’,30);
p1.sex=’男’
B认为这个类还应该有一个sex属性:
function Preson(name,age){ this.name=name; This.age=age; } var p1=new Person('zhangsan',30); var p2=new Person('lisi',20); //p2没有sex属性 //以后每次实例化的person类对象都会自动拥有sex属性 //即使是之前创建的person类对象也会自动拥有sex属性 //为Person类添加了一个叫sex的成员属性 Person.prototype.sex='男'; Person.prototype.say=function(){ //为Person类添加了一个say成员方法 alert(this.name+this.age+this.sex); };
在实际开发中,类内定义思考题1.:
this.speak=function(){}与person.prototype.speak=function(){}有何区别?
以上两种方法,最终都给Person类添加了一个叫speak的方法
第一种:类内定义成员方法,所以使用这个类的程序,都会自动拥有该方法
第二种:类外定义成员方法,只有当前应用程序可以使用speak方法
思考题2.:
l 扩展数组类的功能:
为每一个数组对象添加一个方法,可以查找某个元素的所在位置
Array -->系统自定义类
思考题3:
扩展数字类的功能:
为一个数字对象添加一个方法,该方法的参数为任意数目的整数,然后将所有参数累加到一起,并返回
二、Object类的使用
在Js中,Object是所有类的基类,使用Object类来创建自定义对象时,可以无需定义构造函数
如:在以前,我们需要定义一个人,必须将人这个类定义出来
function Person(){
}
但是,我们可以看出,这个类是空的,里面没有任何属性或方法,通常来讲
这个类的对象一般属于和方法是后添加的
既然这个类是空的,所以我们考虑使用Object类
定义类对象时,不考虑类的类型,只需要存储多个数据,可以考虑使用Object类
如,Object类下有一个方法:
hasOwnProperty(property) ;判断对象下是否具有某个属性
说明object类下的对象都有这个方法
#p#js教程-面向对象编程#e#
三、javascript中模拟类的静态属性
在有些面向对象的语言中,可以使用static关键字定义类的静态属性或方法,这一点,在JavaScript可以进行模拟。
语法:类名.属性名
如:
Math.random(); //使用类名.形式调用的都是静态成员
四、模拟类的私有属性
- 在面向对象思想中,对于有些敏感的,不想公开的成员可以定义为私有的,在JavaScript中可以模拟这个功能。
语法:
function Person(p_name){
var name = p_name; //在类内定义属性时前面加var表示私有的
//私有成员不能在外面被访问
//如果想设置私有成员属性值,可以通过
//构造函数传参
}
五、模拟类的继承功能
l 语法:
Object.prototype.ext=function(parObject){
for(var i in parObject){
this[i]=parObject[i];
}
};
什么情况下使用继承?
有一个类,我们可以使用这个类,但这个类的功能不够完善,我们还不能修改它的源代码,所以需要在自己的类中继承这个类
举例:
Function Person()
{
This.name
This.age
This.say=function
}
但是,我们想完成对一个学生的描述,这时Person类里没有学号,所以我们要继承Person;
六、javascript闭包
所谓“闭包”,指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。
什么时候用闭包
想访问函数内部的变量时
让函数内部的变量始终保存在内存中
function test1(){
i=100;
function test2(){
alert(i++);
}
return test2; 返回test2函数的首地址给一个全局变量
这里用到了变量i,所以i的值不会消失,这就是闭包
}
var result=test1();
result();
七、try…catch语句
- 我们可以添加 try...catch 语句,这样当错误发生时可以采取更适当的措施。
语法:
try{
//要执行的语句
//当这些语句出现错误时,会被catch捕获,从而执行catch语句中指定的内容
}
catch(error){
}
有时,我们可能故意让程序的catch语句运行
Throw语句
- throw 声明的作用是创建 exception(异常)。你可以把这个声明与 try...catch 声明配合使用,以达到控制程序流并产生精确错误消息的目的。
八、关于调试
1) 设置断点:程序运行到这里会自动停止
2) 使用逐语句:遇到函数时会进入到函数的内部
3) 使用逐过程:遇到函数时,直接取函数的运行结果,而不是进入函数
九、JavaScript作用域链