javascript 对象定义方法 简单易学


Posted in Javascript onMarch 22, 2009

工厂模式:
初级开发者可能会这样定义对象:
var obj = new Object();
obj.name = "hero";
obj.showName=function (){alert(this.name);}
这里存在一个问题就是如果我们要在多个地方用obj对象,可能在程序中类似的代码要写好多遍,于是产生了工厂方法
function createObj()
{
var obj = new Object();
obj.name="hero";
obj.showName=function (){alert(this.name);}
return obj;
}
var obj1 = createObj();
var obj2 = createObj();
和另外一种方法 构造函数法
function obj (name)
{
this.name=name;
this.showName= function (){alert(this.name);}
}
把生成对象的代码封装起来,避免出现重复new的代码,当然也可以进一步改进,就是createObj传递一些参数,而不是给obj赋默认固定值:
function createObj(name)
{
var obj = new Object();
obj.name=name;
obj.showName=function (){alert(this.name);}
return obj;
}
var obj1 = createObj("hero");
var o'b'j2=createObj("dby");
但是存在一个问题,就是我们每次调用createObj函数都会创建新的函数 showName.意味着每个对象都有自己版本的showName,所以要改进避开这个问题.
function showName()
{
alert(this.name)
}
function createObj(name)
{
var obj = new Object();
obj.name=name;
obj.showName=showName;
return obj;
}
这样就解决了 重复创建函数的问题, 哈哈哈,大功告成 .
原型方式:
主要是利用对象的prototype属性.
function obj()
{}
obj.prototype.name="hero";
obj.prototype.showName=function()
{
alert(this.name);
}
看起来似乎比刚才的工厂还完美,但是 有一个问题,该函数没有构造函数,属性是通过prototype指定的,这一点在实际应用中很让人头疼,所有的实例的属性都一样实在是不能让人接受.尤其还存在一个安全隐患,那就是当对象中有引用时,例如 加上这样一段
obj.prototype.nameArray = new Array("hero","dby");
然后
obj1 = new obj();
obj2 = new obj();
obj1.nameArray.push("lxw");
在obj2的nameArray中将也会看到这个属性,因为两个对象的nameArray指向的是同一个引用.
所以这种方式并不是理想方法.
需要 改进
结合构造函数,在构造函数定义属性,用原型定义方法
例如
fuction obj(name)
{
this.name = name
this.nameArray = new Array("hero","dby");
}
obj.prototype.showName = function(){alert(this.name)}
所有的非函数属性都在构造函数里创建,函数属性用prototype方式创建,obj1 中改变nameArray的值,不会影响到obj2对象的nameArray的值, 而且只有一个showName函数,所以没有内存浪费.
基本上完美了,剩下的基本都是一下其他的修饰了.有兴趣的可以自己改着玩玩.
笔者在这里加上一个单例 玩了一下:
function obj (name)
{
this.name = name;
this.nameArray=new Array("hero","dby");
if(typeof obj._initialized=='undefined')
{
obj.prototype.showName=function(){alert(this.name);}
obj._initialized="true";
}
}
其实不算是单例, 只不过是在构造对象的时候,先判断一个属性是否被定义,如果没有定义,那么用原型方法继续定义对象,如果已经定义了属性,那么就不在重复定义函数了. 该prototype方法只被创建一次,病赋值一次.
又差不多完美了,大功告成 .
这是个人的理解,,希望对大家有帮助,不完善的地方请qq联系,及时改正。
这是一个完整的实例:
function Rectangle(name,color,width,heigth){
this.name=name;
this.color=color;
this.width=width;
this.heigth=heigth;
}
Rectangle.prototype.area=function(){
return this.width*this.heigth
}
Rectangle.prototype.show=function(){
document.write(this.name+" "+this.color+" "+this.width+" "+this.heigth+"<br/>");
document.write(this.area());
}
var obj1= new Rectangle("Rectangle","red",15,20);
obj1.show();

Javascript 相关文章推荐
IE6,IE7下js动态加载图片不显示错误
Jul 17 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
Aug 02 Javascript
js格式化时间和js格式化时间戳示例
Feb 10 Javascript
JavaScript实现模仿桌面窗口的方法
Jul 18 Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 Javascript
js自制图片放大镜功能
Jan 24 Javascript
Vue自定义指令实现checkbox全选功能的方法
Feb 28 Javascript
javascript闭包的使用之按钮切换功能
Aug 30 Javascript
基于React Native 0.52实现轮播图效果
Aug 25 Javascript
bootstrap table.js动态填充单元格数据的多种方法
Jul 18 Javascript
vue 源码解析之虚拟Dom-render
Aug 26 Javascript
手机浏览器唤起微信分享(JS)
Oct 11 Javascript
JS array 数组详解
Mar 22 #Javascript
javascript multibox 全选
Mar 22 #Javascript
Js 获取当前日期时间及其它操作实现代码
Mar 04 #Javascript
JavaScript 计算当天是本年本月的第几周
Mar 22 #Javascript
DWR Ext 加载数据
Mar 22 #Javascript
dwr spring的集成实现代码
Mar 22 #Javascript
Ext javascript建立超链接,进行事件处理的实现方法
Mar 22 #Javascript
You might like
php基础知识:类与对象(2) 自动加载对象
2006/12/13 PHP
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
PHP二维索引数组的遍历实例分析【2种方式】
2019/06/24 PHP
几个比较经典常用的jQuery小技巧
2010/03/01 Javascript
addEventListener和attachEvent二者绑定的执行函数中的this不相同
2012/12/09 Javascript
js中继承的几种用法总结(apply,call,prototype)
2013/12/26 Javascript
js使用Array.prototype.sort()对数组对象排序的方法
2015/01/28 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
JavaScript中利用Array和Object实现Map的方法
2015/07/27 Javascript
JS实现的图片预览插件与用法示例【不上传图片】
2016/11/25 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
Bootstrap组件之下拉菜单,多级菜单及按钮布局方法实例
2017/05/25 Javascript
js+html5实现页面可刷新的倒计时效果
2017/07/15 Javascript
基于vue cli重构多页面脚手架过程详解
2018/01/23 Javascript
详解用场景去理解函数柯里化(入门篇)
2019/04/11 Javascript
vue实现评论列表功能
2019/10/25 Javascript
vue-路由精讲 二级路由和三级路由的作用
2020/08/06 Javascript
[58:58]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第二场
2018/04/05 DOTA
[52:20]VP vs VG Supermajor小组赛 B组胜者组决赛 BO3 第一场 6.2
2018/06/03 DOTA
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
Python爬虫常用库的安装及其环境配置
2018/09/19 Python
浅谈python str.format与制表符\t关于中文对齐的细节问题
2019/01/14 Python
Python高级特性——详解多维数组切片(Slice)
2019/11/26 Python
Python调用jar包方法实现过程解析
2020/08/11 Python
Python xlrd/xlwt 创建excel文件及常用操作
2020/09/24 Python
SportsDirect.com马来西亚:英国第一体育零售商
2018/11/21 全球购物
党员干部一句话承诺
2014/05/30 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/09/30 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
追悼会答谢词范文
2015/09/29 职场文书
幼儿园保教工作总结2015
2015/10/15 职场文书
微信早安问候语
2015/11/10 职场文书
员工给公司的建议书
2019/06/24 职场文书
导游词之澳门玫瑰圣母堂
2019/12/03 职场文书
MySQL连表查询分组去重的实现示例
2021/07/01 MySQL
PostgreSQL出现死锁该如何解决
2022/05/30 PostgreSQL