JavaScript内核笔记07-面向对象

来源:互联网 发布:java gzip 压缩 乱码 编辑:程序博客网 时间:2024/06/04 01:26

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();//继承Basefunction Final(){this.finalFunc=function(){alert("final behavior");}}Final.prototype=new Middle();//继承Middlefunction test(){var obj=new Final();obj.baseFunc();obj.middleFunc();obj.finalFunc();}test();

2、引用

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);//3alert(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){//私有变量privatevar address="China";//公有方法publicthis.getAddress=function(){return address;}//共有变量publicthis.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);//可以访问,返回:jayalert(jay.getName());//可以访问,返回:jayalert(jay.address);//无法访问,返回:undefinedalert(jay.getAddress());//可以访问,返回:China
<strong>alert(Person.AGE);//通过名字来访问</strong>


1 0
原创粉丝点击