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 相关文章推荐
JavaScript中的关联数组问题
Mar 04 Javascript
javascript 判断两个日期之差的示例代码
Sep 05 Javascript
JS实现仿雅虎首页快捷登录入口及导航模块效果
Sep 19 Javascript
javascript实现tab响应式切换特效
Jan 29 Javascript
js实现页面跳转的五种方法推荐
Mar 10 Javascript
修复jQuery tablesorter无法正确排序的bug(加千分位数字后)
Mar 30 Javascript
利用n工具轻松管理Node.js的版本
Apr 21 Javascript
Vue中封装input组件的实例详解
Oct 17 Javascript
js最简单的双向绑定实例讲解
Jan 02 Javascript
Vue中 v-if 和v-else-if页面加载出现闪现的问题及解决方法
Oct 12 Javascript
原生小程序封装跑马灯效果
Oct 21 Javascript
JS实现简单控制视频播放倍速的实例代码
Apr 18 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(4) php 函数 补充2
2010/02/15 PHP
浅析SVN常见问题及解决方法
2013/06/21 PHP
解析PHP中ob_start()函数的用法
2013/06/24 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
PHP并发多进程处理利器Gearman使用介绍
2016/05/16 PHP
深入浅析Yii admin的权限控制
2016/08/31 PHP
PHP反射学习入门示例
2019/06/14 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
解决jquery submit()提交表单提示:f[s] is not a function
2013/01/23 Javascript
javascript内存管理详细解析
2013/11/11 Javascript
javascript从image转换为base64位编码的String
2014/07/29 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
jQuery实现行文字链接提示效果的方法
2015/03/10 Javascript
jquery实现表格本地排序的方法
2015/03/11 Javascript
Angularjs制作简单的路由功能demo
2015/04/14 Javascript
详解使用vue-cli脚手架初始化Vue项目下的项目结构
2018/03/08 Javascript
nodejs通过钉钉群机器人推送消息的实现代码
2019/05/05 NodeJs
webpack3升级到webpack4遇到问题总结
2019/09/30 Javascript
nuxt 路由、过渡特效、中间件的实现代码
2020/11/06 Javascript
python发送伪造的arp请求
2014/01/09 Python
Python计时相关操作详解【time,datetime】
2017/05/26 Python
Python实现的摇骰子猜大小功能小游戏示例
2017/12/18 Python
使用pandas read_table读取csv文件的方法
2018/07/04 Python
python操作excel的方法
2018/08/16 Python
用python实现k近邻算法的示例代码
2018/09/06 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
2020/03/09 Python
python中openpyxl和xlsxwriter对Excel的操作方法
2021/03/01 Python
基于IE10/HTML5 开发
2013/04/22 HTML / CSS
PHP面试题-$message和$$message的区别
2015/12/08 面试题
计算 s=(x*y)1/2,用两个宏定义来实现
2016/08/11 面试题
后进生转化工作制度
2014/01/17 职场文书
低碳生活的宣传标语
2014/06/23 职场文书
2014年租房协议书范本
2014/10/30 职场文书
Nginx URL重写rewrite机制原理及使用实例
2021/04/01 Servers