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. python特殊成员函数

    1.__init__():构造函数 2.__del__():析构函数 3.print(__doc__):打印描述信息 4.print(Dog.__module__):类来自的模块 5.print(d1 ...

  2. cocos2dx 编译遇到资源里有.svn文件不能删除报错的问题

    使用cocos compile -p android 对项目进行编译的时候,遇到res文件中包含了只读属性的svn目录,不能进行删除而报错. 错误如下图(build_android.py里面对.svn ...

  3. Pychram - 使用介绍

    Pychram - 使用介绍 PyCharm中Directory与Python package的区别 对于Python而言,有一点是要认识明确的,python作为一个相对而言轻量级的,易用的脚本语言( ...

  4. xlua 实现协程替换Unity中的协程

    C#中的协程: IEnumerator ShowSpiritInfo() { UIMessageMgr.ShowMsgWait(true); DestroyUIModelInfo(); bool is ...

  5. Within K stops 最短路径 Cheapest Flights Within K Stops

    2018-09-19 22:34:28 问题描述: 问题求解: 本题是典型的最短路径的扩展题,可以使用Bellman Ford算法进行求解,需要注意的是在Bellman Ford算法的时候需要额外申请 ...

  6. 放弃 Tightvnc, 选择 Tigervnc

    构建headless vnc server ,我终于放弃了Tightvnc 基于以下原因: 1) 已知的Qt5的键盘映射问题,导致virtualbox 的使用出现困难 https://unix.sta ...

  7. 连接PL/SQL

    1.登录PL/SQL Developer 这里省略Oracle数据库和PL/SQL Developer的安装步骤,注意在安装PL/SQL Developer软件时,不要安装在Program Files ...

  8. English trip EM2-PE-6B Teacher:Taylor

    课上内容(Lesson) 词汇(Key Word ) engage [ɪn'ɡedʒ] 订婚 miracle ['mɪrəkl]  n. 奇迹,奇迹般的人或物:惊人的事例 personality  性 ...

  9. 关于Handler中Message的创建问题

    Message用来定义一个包含任意数据的消息对象,这个消息对象是可以被发送给Handler处理的. 我们最好通过Message.obtain()和Handler.obtatinMessage()来得到 ...

  10. laravel调度任务

    <?php namespace App\Console; use Illuminate\Console\Scheduling\Schedule;use Illuminate\Foundation ...