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 相关文章推荐
ASP中用Join和Array,可以加快字符连接速度的代码
Aug 22 Javascript
html超链接打开窗口大小的方法
Mar 05 Javascript
jsPDF生成pdf后在网页展示实例
Jan 16 Javascript
Javascript 读取操作Sql中的Xml字段
Oct 09 Javascript
为何JS操作的href都是javascript:void(0);呢
Nov 12 Javascript
实例详解JavaScript获取链接参数的方法
Jan 01 Javascript
通过扫描二维码打开app的实现代码
Nov 10 Javascript
JavaScript中一些特殊的字符运算
Aug 17 Javascript
Layer弹出层动态获取数据的方法
Aug 20 Javascript
解决vue无法设置滚动位置的问题
Oct 07 Javascript
js作用域和作用域链及预解析
Apr 11 Javascript
jquery实现的分页显示功能示例
Aug 23 jQuery
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
星际中一些鲜为人知的详细资料
2020/03/04 星际争霸
PHP脚本的10个技巧(8)
2006/10/09 PHP
DOMAssitant最新版 DOMAssistant 2.5发布
2007/12/25 Javascript
js获取div高度的代码
2008/08/09 Javascript
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
JavaScript 10件让人费解的事情
2010/02/15 Javascript
javascript 文章截取部分无损html显示实现代码
2010/05/04 Javascript
异步加载script的代码
2011/01/12 Javascript
node.js中的fs.read方法使用说明
2014/12/17 Javascript
通过设置CSS中的position属性来固定层的位置
2015/12/14 Javascript
JavaScript 浏览器兼容性总结及常用浏览器兼容性分析
2016/03/30 Javascript
js 转json格式的字符串为对象或数组(前后台)的方法
2016/11/02 Javascript
JS多物体实现缓冲运动效果示例
2016/12/20 Javascript
jQuery选择器之子元素过滤选择器
2017/09/28 jQuery
微信小程序调用wx.getImageInfo遇到的坑解决
2020/05/31 Javascript
openlayers 3实现车辆轨迹回放
2020/09/24 Javascript
[02:06]2018完美世界全国高校联赛秋季赛开始报名(附彩蛋)
2018/09/03 DOTA
在Gnumeric下使用Python脚本操作表格的教程
2015/04/14 Python
Python字符串拼接、截取及替换方法总结分析
2016/04/13 Python
Python中关键字nonlocal和global的声明与解析
2017/03/12 Python
Python批量合并有合并单元格的Excel文件详解
2018/04/05 Python
python验证码识别教程之滑动验证码
2018/06/04 Python
Flask框架Flask-Login用法分析
2018/07/23 Python
Python之使用adb shell命令启动应用的方法详解
2019/01/07 Python
python 图像插值 最近邻、双线性、双三次实例
2020/07/05 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
英国手工制作的现代与经典的沙发和床:Love Your Home
2020/09/26 全球购物
给分销商的致歉信
2014/01/14 职场文书
水果连锁超市创业计划书
2014/01/24 职场文书
《望洞庭》教学反思
2014/02/16 职场文书
有子女的离婚协议书怎么写(范本)
2014/09/29 职场文书
教师个人查摆剖析材料
2014/10/14 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
在校生证明
2015/06/17 职场文书
新员工实习期个人工作总结
2015/10/15 职场文书
《钓鱼的启示》教学反思
2016/02/18 职场文书