浅谈Javascript面向对象编程

转载地址:http://www.2cto.com/kf/201111/111212.html


Javascript是一门很灵活的语言,允许我们模拟面向对象编程中的很多机机制。在JS中充分使用面向对象设计思想,可以极大限度的提升代码重用、降低模块间的偶合、更好的逻辑分层与并行开发。下面分几个步骤简单谈下我的理解。

 

一、数据类型与包装类

 

包装类 …… 类型名 …… 常见值 …… 分类

 

Number ……number ……123.123 …… 基本数据类型

 

Boolean ……Boolean ……true、false …… 基本数据类型

 

String ……string …… “hello world!” …… 基本数据类型

 

Object ……object ……{}、[] …… 复合数据类型

 

Function ……function ……function(){} …… 特殊类型

 

无 ……undefined ……undefined、未定义  …… 小数据类型

 

无 ……null ……null …… 小数据类型

 

         内置类型与本文关系不大,不列出。

 

二、引用类型与值类型

 

引用类型:object function

 

值类型:number、boolean、string、null、undefined

 

三、new function(构造器)与prototype(原型)

 

关于prototype的设计模式就不多说了,网上很多介绍,以一个例子介绍一下js中使用new构造对象的过程。

 

function classname(){this.id=0;}   var v=new classname();

 

当使用function构造对象时,进行以下流程:

 

1、 查找classname的prototype,并进行浅拷贝。

 

2、  绑定this指针到拷贝来的对象。

 

3、  将this.constructor属性设置为classname。

 

[注:其实classname.prototype.constructor的值也被设置为classname,第六部分会说明]

 

4、  执行用户{}中的代码。

 

5、  返回this指针赋予左值v。

 

四、实现面向对象的三个基本特征

 

1、 封装

 

封装这个大家都明白,在js中,重点在于访问权限。在其他原生支持面向对象语言中,一般支持public、protected、private三个关键字来控制访问权限,但在js中,我们只能依靠复杂的作用域关系来控制:

 

function classname(a){

 

        var uid=a; //uin为模拟private,作用域为{},外部无法使用

 

        this.getuid=function(){return a;} //为uid提供一个外部只读接口obj.getuid();

 

        this.setuid=function(val){a=val} //为uid提供一个外部可写接口obj.setuid(5);

 

this.id=uid; //id为模拟public   obj.id 使用

 

}

 

classname.prototype.func=function(){}; //模拟public方法obj.func()调用

 

classname.stafunc=function(){}; //模拟静态方法classname.stafunc()调用

 

var obj=new classname(1);

 

[!]非常需要注意的就是,因为function是引用类型,classname.prototype.func是所有对象共享的一个function对象(每个对象仅存着引用),因此对象规模不大。而使用this.getuid和this.setuid为定义一个function,因此每个对象实例都会存一份,如果放肆使用这种方法,会造成对象规模庞大,影响性能。个人认为模拟private变量的意义不大。

 

[!]如果有需求真的需要大量使用this.xxx=function(){}这种情况,在function(){}中的this指针与最外的this指针是不同的,最好在类定义的首行加上var _this=this;,这样在this.xxx=function(){}中也可以方便使用绑定的指针。

 

2、 继承

 

继承的实现,主要有2种方法:第一种是使用javascript本身的原型模型,通过给prototype赋值并改变其constructor属性来实现继承;第二种方法是不使用prototype,手动实现将父对象的所有属性方法深拷贝到子对象。比如A需要继承B,第一种写法可以:A.prototype=new B();A.prototype.constructor=A; 第二种写法可以写一个递归,或者使用jquery中的方法extend。另外,如果要实现多继承的话,prototype就真的好麻烦了(需要依次多个类,还要建空对象来接),第二种方法就比较简单,依次拷贝即可。一般这种继承为了找父类方便,可以在对象中加个属性,引用父类。

 

3、 多态

 

函数重载就不说了,都会,检查参数即可,很灵活。隐藏属性就是直接赋值undefined。需要注意的是,如果是打算继承B类的prototype,一定要建一个空对象来接,否则的话,你给类写方法的话,相当于直接修改了prototype,就算不写方法,你最后修改constructor时也会造成继承链错乱,接个空对象很容易:

 

function temp(){};

 

temp.prototype=B;

 

var obj=new temp();

 

这样再让需要继承B.prototype的类继承obj即可,即便修改prototype也不会影响到B。而且也不像继承new B()那样浪费很多空间。

 

五、深拷贝与浅拷贝

 

这个和其他语言中没什么区别,浅拷贝就是直接拷贝,遇到引用类型或类类型不再深入。深拷贝则是根据类型判断,进行递归拷贝。

 

六、prototype.constructor

 

这个值主要是用于维护继承的原型链。

 

七、JS的面向对象开发

 

由于我不是前台开发人员,见过项目有限,仅谈自己的经验。

 

我开发过的B/S,常用两种架构,一种是以CGI为主,由后台语言去生成HTML,JS仅仅做一些用户交互,ajax通信等。另外一种是使用MVC,后台语言仅仅生成JSON,View层完全由JS组件在客户端实现。后者一般大量使用面向对象的思想进行编程,将组件封装成类,将JSON传入构造函数,再由控制器或布局组件Add进来。由于组件可以重用,在开发后台管理系统、JS游戏上,效率还是很可观的。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园的建设目标是通过数据整合、全面共享,实现校园内教学、科研、管理、服务流程的数字化、信息化、智能化和多媒体化,以提高资源利用率和管理效率,确保校园安全。 智慧校园的建设思路包括构建统一支撑平台、建立完善管理体系、大数据辅助决策和建设校园智慧环境。通过云架构的数据中心与智慧的学习、办公环境,实现日常教学活动、资源建设情况、学业水平情况的全面统计和分析,为决策提供辅助。此外,智慧校园还涵盖了多媒体教学、智慧录播、电子图书馆、VR教室等多种教学模式,以及校园网络、智慧班牌、校园广播等教务管理功能,旨在提升教学品质和管理水平。 智慧校园的详细方案设计进一步细化了教学、教务、安防和运维等多个方面的应用。例如,在智慧教学领域,通过多媒体教学、智慧录播、电子图书馆等技术,实现教学资源的共享和教学模式的创新。在智慧教务方面,校园网络、考场监控、智慧班牌等系统为校园管理提供了便捷和高效。智慧安防系统包括视频监控、一键报警、阳光厨房等,确保校园安全。智慧运维则通过综合管理平台、设备管理、能效管理和资产管理,实现校园设施的智能化管理。 智慧校园的优势和价值体现在个性化互动的智慧教学、协同高效的校园管理、无处不在的校园学习、全面感知的校园环境和轻松便捷的校园生活等方面。通过智慧校园的建设,可以促进教育资源的均衡化,提高教育质量和管理效率,同时保障校园安全和提升师生的学习体验。 总之,智慧校园解决方案通过整合现代信息技术,如云计算、大数据、物联网和人工智能,为教育行业带来了革命性的变革。它不仅提高了教育的质量和效率,还为师生创造了一个更加安全、便捷和富有智慧的学习与生活环境。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值