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 相关文章推荐
学习jquery之一
Apr 27 Javascript
6个DIV 135或246间隔一秒轮番显示效果
Jul 24 Javascript
js Function类型
Dec 04 Javascript
JS实现的仿东京商城菜单、仿Win右键菜单及仿淘宝TAB特效合集
Sep 28 Javascript
jQuery设置Cookie及删除Cookie实例分析
Apr 15 Javascript
jQuery模拟Marquee实现无缝滚动效果完整实例
Sep 29 Javascript
node操作mysql数据库实例详解
Mar 17 Javascript
Angular2 自定义validators的实现方法
Jul 05 Javascript
自定义PC微信扫码登录样式写法
Dec 12 Javascript
Angular7中创建组件/自定义指令/管道的方法实例详解
Apr 02 Javascript
微信小程序可滑动周日历组件使用详解
Oct 21 Javascript
微前端qiankun改造日渐庞大的项目教程
Jun 21 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 session常见问题集锦及解决办法总结
2007/03/18 PHP
php中对2个数组相加的函数
2011/06/24 PHP
PHP往XML中添加节点的方法
2015/03/12 PHP
php获取本周星期一具体日期的方法
2015/04/20 PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
2018/04/21 PHP
新浪中用来显示flash的函数
2007/04/02 Javascript
JS无限极树形菜单,json格式、数组格式通用示例
2013/07/30 Javascript
文本有关的样式和jQuery求对象的高宽问题分别说明
2013/08/30 Javascript
javascript元素动态创建实现方法
2015/05/13 Javascript
jQuery网页版打砖块小游戏源码分享
2015/08/20 Javascript
Javascript将双字节字符转换成单字节字符并计算长度
2016/06/22 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
JavaScript中在光标处插入添加文本标签节点的详细方法
2017/03/22 Javascript
微信小程序登录态控制深入分析
2017/04/12 Javascript
Angular获取手机验证码实现移动端登录注册功能
2017/05/17 Javascript
使用Vue自定义指令实现Select组件
2018/05/24 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
每周一练 之 数据结构与算法(Stack)
2019/04/16 Javascript
基于ssm框架实现layui分页效果
2019/07/27 Javascript
开源一个微信小程序仪表盘组件过程解析
2019/07/30 Javascript
Python 爬虫学习笔记之多线程爬虫
2016/09/21 Python
python用reduce和map把字符串转为数字的方法
2016/12/19 Python
libreoffice python 操作word及excel文档的方法
2019/07/04 Python
python字符串替换re.sub()方法解析
2019/09/18 Python
Python restful框架接口开发实现
2020/04/13 Python
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
关于keras中keras.layers.merge的用法说明
2020/05/23 Python
Python如何获取文件路径/目录
2020/09/22 Python
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
前处理班长职位说明书
2014/03/01 职场文书
高校教师自荐信范文
2014/03/13 职场文书
保安2014年终工作总结
2014/12/06 职场文书
工程质检员岗位职责
2015/04/08 职场文书
学术研讨会主持词
2015/07/04 职场文书
Python中常见的导入方式总结
2021/05/06 Python
java实现面板之间切换功能
2022/06/10 Java/Android