JavaScript是基于对象的而非基于类,但是,JavaScript的的函数式语言的特性使得它本身是可编程的,它可以变成你想要的任何形式。JavaScript的OO风格代码开发:
1、原型继承
JavaScript中的继承可以使用原型链来实现,调用对象上的一个方法,由于方法在JavaScript对象中是对另一个函数对象的引用,因此解释器会在对象中查找该属性,如果没有
找到,则在其内部对象prototype对象上搜索,由于prototype对象和对象本身的结构是一样的,因此这一个过程会一直回溯到发现该属性,则调用该属性,否则报告一个错误。
关于原型继承,如下例:
//原型继承 function Base() { this.baseFunc=function() { alert("base behavior"); } } function Middle() { this.middleFunc=function() { alert("middle behavior"); } } Middle.prototype=new Base();//继承Base function Final() { this.finalFunc=function() { alert("final behavior"); } } Final.prototype=new Middle();//继承Middle function test() { var obj=new Final(); obj.baseFunc(); obj.middleFunc(); obj.finalFunc(); } test();
JavaScript的应用和其他语言的不同之处在于,它的引用始终指向最终的对象,而非引用本身,如下例:
//引用实例 var obj={};//空对象 var ref=obj; obj.name="objectA"; alert(ref.name);//ref也跟着增加了name属性 obj=["one","two","three","four"];//obj指向了另外一个对象(数组对象) alert(ref.name);//ref还指向原来的对象 alert(obj.length);//3 alert(ref.length);//undefined //说明:<span style="font-size:18px;color:#ff0000;"><strong>obj只是对一个匿名对象的引用</strong></span>,因此,ref并非指向它,当obj指向另一个数组对象时可以看到,引用ref并没有改变。 //而始终指向那个后来添加了name属性的“空”对象{}。。<strong>修改obj的指向不回影响到ref,但是修改原对象的值,则会影响到其引用对象</strong>。
3、new操作符
采用new操作符定义function对象,可以实现类似java一样的对象创建。而对于json格式的对象则不能用new来创建,function(){}这种默认构造定义的对象则可以。如:
var a={name:‘name‘};var b=new a(); 不可行
var a=function(){alert(‘3‘);};var b=new a(); 可行
4、封装
事实上,我们可以通过JavaScript函数实现封装,封装的好处在于,未经授权的客户代码无法访问到我们不公开的数据,如下例:
//封装,共有、私有的定义 function Person(name) { //私有变量private var address="China"; //公有方法public this.getAddress=function() { return address; } //共有变量public this.name=name; } //通过原型prototype扩展方法,共有方法 Person.prototype.getName=function() { return this.name; } Person.prototype.setName=function(name) { this.name=name; }
<strong>Person.AGE=1000;//静态变量</strong> /* 说明:首先声明一个函数作为模板,用面向对象的术语来讲就是一个“类”,用var方式声明的变量仅在类内部可见,所以address是一个私有成员变量, 访问address的唯一方式是,<strong>通过暴露出来的getAddress方法,而set/getName方法均为原型链上的方法</strong>,因此为公开的。测试如下: */ var jay=new Person("jay"); alert(jay.name);//可以访问,返回:jay alert(jay.getName());//可以访问,返回:jay alert(jay.address);//无法访问,返回:undefined alert(jay.getAddress());//可以访问,返回:China
<strong>alert(Person.AGE);//通过名字来访问</strong>
原文地址:http://blog.csdn.net/upup918/article/details/48104357