JS封装类或对象的最佳方案

面向对象强大的优点之一是能够创建自己专用的类或者对象,封装一组属性和行为。抛开性能来说,JS要比面向对象语言如JAVA要灵活好用的多,组装数据结构很灵活方便。那么我们如何来用面向对象的思维来定义JavaScript的类或对象呢?

问题的出现

如果要抽象出来一个人,那么简单的属性为:name,sex,birthday等,方法为:sayHi,最初级的写法就是

 

var oPerson = new Object;

oPerson.name = "zs";

oPerson.sex = 'boy';

oPerson.birthday = '2001-02-03';

oPerson.sayHi = function()

{

alert("Hi ! I am "+this.name);

}

那么我们要多创建几个人,怎么办呢?就得再写几个Object,那得哭死,那么怎么办呢?看下面的几种解决方案:

下面的最终解决方案可能不是最佳,但是我目前的水平,是觉得最佳的,欢迎指教

 

functon createPerson(name,sex,birthday)

{

var oPerson = new Object;

oPerson.name =name;

oPerson.sex = sex;

oPerson.birthday = birthday;

oPerson.sayHi = function()

{

alert("Hi ! I am "+this.name);

}

return oPerson;

}

//那么我们多创建几个人的话,就可以

var person1 = new createPerson('zs','boy','2001-02-03');

var person2 = new createPerson('ls','boy','2001-02-04');

person1.sayHi();

person2.sayHi();

看上去,似乎解决了,但是问题是 你创建几个人就创建了几个sayHi行为,但是他们都是一个功能,怎么办呢?JS的灵活造就了下面的解决方法,把方法作为一个对象的属性:

 

function sayHi()

{

alert("Hi ! I am "+this.name);

}

functon createPerson(name,sex,birthday,fn)

{

var oPerson = new Object;

oPerson.name =name;

oPerson.sex = sex;

oPerson.birthday = birthday;

oPerson.sayHi = sayHi;//这里是个函数引用

return oPersn;

}

var person1 = new createPerson('zs','boy','2001-02-03');

var person2 = new createPerson('ls','boy','2001-02-04');

person1.sayHi(); //outputs "Hi ! I am zs"

person2.sayHi(); //outputs "Hi ! I am ls"

问题似乎解决了,但是,你参见prototype就会发现人家有更高明的解决方案,所有函数只创建一次,而每个对象都具有自己的对象属性实例,看下面的代码:

最终方案

 

functon CreatePerson(name,sex,birthday,fn)

{

this.name =name;

this.sex = sex;

this.birthday = birthday;

}

CreatePerson.prototype.sayHi = function ()

{

alert("Hi ! I am "+this.name);

}

var person1 = new CreatePerson('zs','boy','2001-02-03');

var person2 = new CreatePerson('ls','boy','2001-02-04');

person1.sayHi(); //outputs "Hi ! I am zs"

person2.sayHi(); //outputs "Hi ! I am ls"

一般情况下,一个对象或者类不只一个方法,需要多个方法配合使用,那么

CreatePerson.prototype={

sayHi:function()

{

alert("Hi ! I am "+this.name);

},

walk:function()

{

alert("walk,walk");

},

……

}

是不是优雅的多?

JS-封装类或对象的最佳方案的更多相关文章

  1. JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...

  2. js构建ui的统一异常处理方案(一)

    从早期从事基于java的服务器端开发,再到之后从事基于web和js的ui开发,总体感觉基于web页面的ui开发远不如服务器端健壮.主要是早期ie浏览器功能太弱小,很多业务被迫放到服务器端去实现,浏览器 ...

  3. Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案

    的最佳方案 标签: Android屏幕旋转AsyncTaskProgressDialog 2014-07-19 09:25 39227人阅读 评论(46) 收藏 举报 分类: [android 进阶之 ...

  4. js中Array对象方法详解

    操作方法:concat() slice() splice() concat()方法可以基于当前数组中的所有项创建一个新数组.具体来说,这个方法会创建当前数组一个副本,将接收到参数添加到副本的末尾,最后 ...

  5. 前端页面js与flash交互——js获取flash对象,并传递参数

    背景介绍: 最近在搞一个项目,涉及到图片选取,裁剪,上传等,由于浏览器安全性问题,js无法获取到<input type="file">中选取的文件路径,而且对照片的裁剪 ...

  6. JS内置对象有哪些?

    JS内置对象分为数据封装类对象和其他对象 数据封装类对象:String,Boolean,Number,Array,和Object; 其他对象:Function,Arguments,Math,Date, ...

  7. Android DiskLruCache完全解析,硬盘缓存的最佳方案

    Android DiskLruCache完全解析,硬盘缓存的最佳方案 概述   记得在很早之前,我有写过一篇文章Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Andro ...

  8. js的dom对象(带实例超详细全解)

    js的dom对象(带实例超详细全解) 一.总结 一句话总结: 1.DOM中的方法区分大小写么? 解答:区分 2.DOM中元素和节点的关系式什么? 解答:元素就是标签,节点中有元素节点,也是标签,节点中 ...

  9. 聊聊 PC 端自动化最佳方案 - Pywinauto

    1. 前言 大家好,我是安果! 上一篇文章,聊到 PC 端的一种自动化方案:WinAppDriver 聊聊 PC 端自动化最佳方案 - WinAppDriver 有小伙伴后台给我留言,说「 pywin ...

随机推荐

  1. 首篇 sdk 之 AlertDialog

    带着十足的干劲,用着有限的英语水平,我们来看看sdk里docs里的AlertDialog: AlertDialog SDK 原文描述:A dialog that can show a title, u ...

  2. Cordova+Vue快速搭建Hybrid App

    前言 最近项目迭代需要开发一个app,由于项目组其他系统前端技术栈都是Vue,所以自己在需求评估的时候就初步敲定了Cordova+Vue的前端架构,后来查阅了不少资料,也掉了不少坑,这里总结一下,也算 ...

  3. C语言之网络编程(服务器和客户端)

    Linux网络编程 1. 套接字:源IP地址和目的IP地址以及源端口号和目的端口号的组合称为套接字.其用于标识客户端请求的服务器和服务. 常用的TCP/IP协议的3种套接字类型如下所示. (1)流套接 ...

  4. ubuntu配置chrome git

    安装chrome (也可以直接从官网下载deb包安装) sudo wget http://www.linuxidc.com/files/repo/google-chrome.list -P /etc/ ...

  5. input = time 微信端(移动端)

    垂直居中不管用:用margin-top解决 默认值value 不生效:严格按照日期格式设置

  6. Anaconda 简单介绍 -- 环境管理

    前面介绍了 Anaconda 的安装,接下来介绍一下 简单使用,后续并实时更新. 常用操作命令: 环境操作 1.查看环境管理的全部命令帮助: conda env -h 2.查看当前系统下的环境: co ...

  7. spring cloud: zuul(二): zuul的serviceId/service-id配置(微网关)

    spring cloud: zuul(二): zuul的serviceId/service-id配置(微网关) zuul: routes: #路由配置表示 myroute1: #路由名一 path: ...

  8. English trip V1 - 11.What's That? 那是什么?Teacher:Patrick Key:There's/There are

    In this lesson you will learn to describe the position of an object. 在本课中,您将学习如何描述对象的位置. 课上内容(Lesson ...

  9. Android+Servlet+MySql+JSON实现简单的数据查询操作--C/S架构

    本例简单地实现Android客户端与服务器端交互,主要是通过客户端输入内容(学号)提交到服务器端,服务器端与数据库交互去查询相应信息(姓名).根据这个做个完整的安卓登录是没问题的.本例数据库服务器都采 ...

  10. WPF:数据和行为

    如果自己来做一个UI框架,我们会首先关注哪些方面?我想UI框架主要处理的一定包括两个主要层次的内容,一个是数据展现,另一个就是数据操作,所以UI框架必须能够接收各种不同的数据并通过UI界面展现出来,然 ...