JS-封装类或对象的最佳方案
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-封装类或对象的最佳方案的更多相关文章
- JavaScript 实现命名空间(namespace)的最佳方案——兼容主流的定义类(class)的方法,兼容所有浏览器,支持用JSDuck生成文档
作者: zyl910 一.缘由 在很多的面向对象编程语言中,我们可以使用命名空间(namespace)来组织代码,避免全局变量污染.命名冲突.遗憾的是,JavaScript中并不提供对命名空间的原生支 ...
- js构建ui的统一异常处理方案(一)
从早期从事基于java的服务器端开发,再到之后从事基于web和js的ui开发,总体感觉基于web页面的ui开发远不如服务器端健壮.主要是早期ie浏览器功能太弱小,很多业务被迫放到服务器端去实现,浏览器 ...
- Android 屏幕旋转 处理 AsyncTask 和 ProgressDialog 的最佳方案
的最佳方案 标签: Android屏幕旋转AsyncTaskProgressDialog 2014-07-19 09:25 39227人阅读 评论(46) 收藏 举报 分类: [android 进阶之 ...
- js中Array对象方法详解
操作方法:concat() slice() splice() concat()方法可以基于当前数组中的所有项创建一个新数组.具体来说,这个方法会创建当前数组一个副本,将接收到参数添加到副本的末尾,最后 ...
- 前端页面js与flash交互——js获取flash对象,并传递参数
背景介绍: 最近在搞一个项目,涉及到图片选取,裁剪,上传等,由于浏览器安全性问题,js无法获取到<input type="file">中选取的文件路径,而且对照片的裁剪 ...
- JS内置对象有哪些?
JS内置对象分为数据封装类对象和其他对象 数据封装类对象:String,Boolean,Number,Array,和Object; 其他对象:Function,Arguments,Math,Date, ...
- Android DiskLruCache完全解析,硬盘缓存的最佳方案
Android DiskLruCache完全解析,硬盘缓存的最佳方案 概述 记得在很早之前,我有写过一篇文章Android高效加载大图.多图解决方案,有效避免程序OOM,这篇文章是翻译自Andro ...
- js的dom对象(带实例超详细全解)
js的dom对象(带实例超详细全解) 一.总结 一句话总结: 1.DOM中的方法区分大小写么? 解答:区分 2.DOM中元素和节点的关系式什么? 解答:元素就是标签,节点中有元素节点,也是标签,节点中 ...
- 聊聊 PC 端自动化最佳方案 - Pywinauto
1. 前言 大家好,我是安果! 上一篇文章,聊到 PC 端的一种自动化方案:WinAppDriver 聊聊 PC 端自动化最佳方案 - WinAppDriver 有小伙伴后台给我留言,说「 pywin ...
随机推荐
- python特殊成员函数
1.__init__():构造函数 2.__del__():析构函数 3.print(__doc__):打印描述信息 4.print(Dog.__module__):类来自的模块 5.print(d1 ...
- cocos2dx 编译遇到资源里有.svn文件不能删除报错的问题
使用cocos compile -p android 对项目进行编译的时候,遇到res文件中包含了只读属性的svn目录,不能进行删除而报错. 错误如下图(build_android.py里面对.svn ...
- Pychram - 使用介绍
Pychram - 使用介绍 PyCharm中Directory与Python package的区别 对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言( ...
- xlua 实现协程替换Unity中的协程
C#中的协程: IEnumerator ShowSpiritInfo() { UIMessageMgr.ShowMsgWait(true); DestroyUIModelInfo(); bool is ...
- Within K stops 最短路径 Cheapest Flights Within K Stops
2018-09-19 22:34:28 问题描述: 问题求解: 本题是典型的最短路径的扩展题,可以使用Bellman Ford算法进行求解,需要注意的是在Bellman Ford算法的时候需要额外申请 ...
- 放弃 Tightvnc, 选择 Tigervnc
构建headless vnc server ,我终于放弃了Tightvnc 基于以下原因: 1) 已知的Qt5的键盘映射问题,导致virtualbox 的使用出现困难 https://unix.sta ...
- 连接PL/SQL
1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...
- English trip EM2-PE-6B Teacher:Taylor
课上内容(Lesson) 词汇(Key Word ) engage [ɪn'ɡedʒ] 订婚 miracle ['mɪrəkl] n. 奇迹,奇迹般的人或物:惊人的事例 personality 性 ...
- 关于Handler中Message的创建问题
Message用来定义一个包含任意数据的消息对象,这个消息对象是可以被发送给Handler处理的. 我们最好通过Message.obtain()和Handler.obtatinMessage()来得到 ...
- laravel调度任务
<?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule;use Illuminate\Foundation ...