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作用域链

技术分享
技术分享

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。