现在的位置: 首页 > 综合 > 正文

理解javascript类的实现

2018年05月04日 ⁄ 综合 ⁄ 共 1129字 ⁄ 字号 评论关闭

 http://blog.csdn.net/leiyuanxiu/archive/2009/04/07/4054455.aspx

理解javascript类的实现 收藏
javascript中可以用function关键字来定义一个类,在函数内部通过this指针引用的变量或者是方法都会成为类的成员:

function class1(){

var s = "abc";

this.p1=s;

this.method1=function(){

       alert("this is a test method");

}

}

var obj1 = new class1();

当通过new class()获得对象obj1时,这个对象便自动获得了属性p1和方法method1。在JavaScript中,function本身的定义就是类的构造函数,下面来看使用new创建对象的过程:

1 当解释器遇到new操作符便创建一个空对象;

2 开始运行class1这个函数,并将其中的this指针都指向这个新建的对象;

3 因为当给对象不存在的属性赋值的时,解释器就会为对象创建该属性,例如在class1中,当执行到this.p1=s这条语句时,就会添加一个属性p1,并把变量s值赋给它,这样函数执行就是初始化这个对象的过程,即实现了构造函数的调用。

4 当函数执行完成以后,new操作符就返回初始化后的对象。

这种方式的缺点是:

1 将所有的初始化语句,成员定义放在一起,代码逻辑不够清晰。

2 每创建一个类的实例,都要执行一次构造函数,所以实际上构造函数中定义的属性和方法总被重复的创建。

使用prototype对象来定义类成员。

<script>

function class1(){

this.prop=1;

}

calss1.prototype.showProp=function(){

       alert(this.prop);

}

var obj1= new class1();

obj1.showProp();

</script>

因为prototype是JavaScript对象,所以可以为prototype对象添加,修改,删除方法和属性,从而为一个类添加成员定义。

现在再来看new的执行过程:

1 创建一个新对象并且让this指针指向它

2 将函数的prototype对象的所有成员都付给这个新对象。

3 执行函数体,对这个对象进行初始化操作。

4 返回1中创建的对象。

现在是多了用prototype来初始化对象的过程,这个初始化过程发生在函数体调用之前,所以可以在函数体内部调用prototype中定义的属性和方法。

需要注意的是:

原型对象的定义必须在创建类的实例语句之前,否则它将不起任何作用。

class1.prototype.costructor===class1。

 

抱歉!评论已关闭.