| Javascript面向对象编程
					当前位置:点晴教程→知识管理交流
					
					→『 技术文档交流 』
					
				 
 [b][color=#0000ff]---->什么是类和对象[br][/color][/b]    这是所有面向对象编程之前必须弄明白的.[br]    所谓类:简单地说就是模板,说的专业一些,是一类具有某种性质的物的集合.比如:人就是一个类,车也是一个类,等等.[br]    所谓对象:就是类的具体实现.如上面所说,人是一个类,一个具体的人就是一个对象,比如张三.[br]    [br]    对象是类的实例化后的结果.javascript中使用new关键字来实例化一个类,生成一个对象.[br]    例子:[br]        function people(){    //javascript中一个function也是一个类,这里我们建立一个空的类people[br]        }[br]        [br]        var zhangsan=new people;    //实例化生成一个对象张三[br][br][b][color=#0000ff]---->一个具体形象的例子[/color][/b][br]    /*-->最简单的类:[br]    *people类[br]    *    属性:性别,年龄,姓名[br]    *    方法:说话[br]    */[br]        function people(name,sex,age){[br]            this.name=name;[br]            this.sex=sex;[br]            this.age=age;[br]            this.say=function(){[br]                return "我叫"+this.name;[br]            }[br]        }[br]        [br]        使用时:[br]        var zhangsan=new people;[br]        alert(zhangsan.say());[br]        var lisi=new people;[br]        alert(lizi.say());[br]        说明:[br]            上面使用了this关键字,this总是指向当前的对象,在上面例子中,zhangsan.say中具有this.name,这里的this是当前的对象zhangsan.后面lisi.say则是指向当前对象lisi[br]            对象具有属性,上面的name,sex和age就是对象的属性.我们这样可以访问,如lisi.name,zhangsan.age[br]            对象还具有方法,比如上面的say.方法是通过构造函数实现的.使用时,如上面,用lisi.say(),zhangsan.say()[br]            [br]            当然我们还可以在实例化对象后为对象添加新的属性和方法.比如:[br]            zhangsan.girlfriend="小丽";[br]            zhangsan.doing=function(){[br]                return "i am eating";[br]            }[br][br]---->javascript类/对象和其他面向对象语言的异同[br]    相同点:面向对象编程的思想都是一样的,世界上所有的具体事物都可以看成对象,而这些事物从属的集合都可以看成类.我们要做的是构造我们需要的类,在实例化成我们需要的对象为我们工作.[br]    不同点:其他面向对象编程的语言对于类/对象关心下面的事情:[br]            1.作用域:公用,私用,受保护,静态.而javascript只有一种作用域:公用作用域.[br]            2.特性:继承,多态.javascript不支持多态,继承方面的内容将在"javascript对象的继承"一文中介绍[br][br][color=#0000ff][b]---->构建javascript类/对象的方式[/b][/color][br]    首先,可以大致定义出下面几种类型:[br]        1.工厂方式[br]        2.构造函数方式[br]        3.原型方式[br]        4.混合的构造函数/原型方式[br]        5.动态原型方法[br]        6.混合工厂方式[br]    [br]    具体说明:[br]       [b][color=#ff0000] a.工厂方式:[/color][/b][br]            所谓工厂方式,是指先建立对象,然后再往对象里面添加属性和方法.[br]            eg.1[br]                var zhangsan=new object;    //创建对象[br]                zhangsan.name="张三";        //给对象添加属性[br]                zhangsan.say=function(){    //给对象增加方法[br]                    alert("我叫张三");[br]                }[br]            eg.2 上面的例子没有封装性,我们可以使用函数封装,实现多重利用[br]                function people(){[br]                    var p_object=new object;[br]                    p_object.name="张三";[br]                    p_object.say=function(){[br]                        alert("我叫张三");[br]                    }[br]                    return p_object;    //返回对象[br]                }[br]                var zhangsan=people;[br]                var lisi=people;[br]                上面zhangsan和lisi两个对象具有完全相同的属性和方法,都叫"张三"(name属性),都会说"我叫张三"(say()方法)[br]            eg.3 通过传递参数改进eg.2[br]                function people(name){[br]                    var p_object=new object;[br]                    p_object.name=name;[br]                    p_object.say=function(){[br]                        alert("我叫"+this.name);[br]                    }[br]                    return p_object;    //返回对象[br]                }[br]                var zhangsan=people("张三");[br]                var lisi=people("李四");[br]            总结:[br]                工厂方式,总是先创建一个对象,再往对象中添加你需要的属性和方法.但这种做法对于封装性和多种利用性不是很有利,这导致了这种对象的构造方法不被提倡.[br]                使用工厂方式总是为每个对象创建独立的函数版本.[br]                这类方式使用封装然后调用新对象的时候不使用new创建对象. [p]b.构造函数方式:[br] 所谓构造函数方式,就像我给出的例子"一个具体形象的例子",就是采用构造函数的方式.它和工厂方式的区别是不再在函数内部创建一个对象.而是通过this关键字指向当前对象.[br] 构造函数的例子不再给出.[br] 构造函数和工厂方式一样,会重复生成函数,为每个版本的对象创建独立的函数版本.[br] [br] c.原型方式[br] 所谓原型方式,就是利用prototype属性来实现属性和方法的继承[br] eg.1[br] function people(){[br] }[br] [br] people.prototype.name="张三";[br] people.prototype.say=function(){[br] alert("我叫"+this.name);[br] };[br] [br] var zhangsan=new people();[br] var lisi=new people();[br] 原型方式不能通过构造函数传递参数初始化属性的值,因为所有的属性和方法都是通过prototype添加的[br] [br] d.混合的构造函数/原型方式[br] 对于对象的属性,使用构造函数的方式[br] 对于对象的方法,使用原型方式[br] eg.1[br] function people(name){[br] this.name=name;[br] }[br] people.prototype.say=function(){[br] return "我的名字叫"+this.name;[br] };[br] [br] var zhangsan=new people("张三");[br] document.write(zhangsan.say());[br] [br] eg.2 我们也可以把prototype写入类,实现视觉上的封装.[br] function people(name){[br] this.name=name;[br] people.prototype.say=function(){[br] return "我的名字叫"+this.name;[br] };[br] }[br] [br] var zhangsan=new people("张三");[br] document.write(zhangsan.say());[br] [br] 总结:这种构造类/对象的方法是推荐使用的[br] [br] e.动态原型方式[br] 这是在混合的构造函数/原型方式上改进的一种方式(提供更友好的编码风格),他们功能是等价的[br] eg.1[br] function people(name){[br] this.name=name;[br] if(typeof people._initialized=="undefined"){[br] people.prototype.say=function(){[br] return "我的名字叫"+this.name;[br] };[br] people._initialized=true;[br] }[br] }[br] var zhangsan=new people("张三");[br] document.write(zhangsan.say());[br] var lisi=new people("李四");[br] document.write(lisi.say());[br] 这样处理的目的是创建对象的方法后下一次使用时不要再创建.[br] 由于上面的原因,动态原型方式也是javascript中常用的一种创建类/对象的一种方式[br] [br] f.混合工厂方式[br] 混合工厂方式几乎和工厂方式是一样的.它同样是先构造对象,然后再往对象中添加属性和方法.不同的是,混合工厂方式生成对象时依旧使用new关键字.[br] eg.1[br] function people(){[br] var p_object=new object;[br] p_object.name="张三";[br] p_object.say=function(){[br] alert("我叫张三");[br] }[br] return p_object; //返回对象[br] }[br] var zhangsan=new people;[br] var lisi=new people;[br] zhangsan.say();[br] lisi.say();[br] 混合工厂方式和工厂方式以及经典方式(构造函数,原型方式)一样会产生问题,不推荐使用[br] [br] 对各种构建类/对象方式的总结:[br] 通常地,我们使用混合的构造函数/原型方式,即属性使用构造函数方式,方法采用原型方式.当然,加强地,我们可以使用动态原型方式.[br] 上面两种方式是推荐使用的.[br] [br] [br]---->关于prototype的其他功能[br] 1.给对象(包括本地对象)添加新的方法[br] 比如array对象,你可能需要添加一个方法tohexstring,你可以这样做:[br] array.prototype.tohexstring=function(){[br] //code here[br] }[br] 2.重定义方法[br] 实质是让方法指向一个新的函数[br] array.prototype.tohexstring=function(){[br] //other code href[br] }[/p] 该文章在 2010/7/14 1:40:00 编辑过 | 关键字查询 相关文章 正在查询... |