浅谈Javascript面向对象编程

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-01 20:22 点击:

 

 

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属性来实现继承;第

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Gb2312转utf-8编码的方法(vbs+js)
      • 如何使用Ajax技术开发Web应用程序(1)
      • js跳转路径问题
      • JavaScript模仿桌面窗口
      • 用js检测两个线段是否相交
      • 我知道的JavaScript -- 设计模式(桥接)应用之 – 验证器
      • 运用JavaScript构建你的第一个Metro式应用程序(on Windows
      • 我是如何去了解jquery的(六),案例之幻灯片轮换
      • Jquery封装幻灯片效果
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1