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 相关文章推荐
js 实现无干扰阴影效果 简单好用(附文件下载)
Dec 27 Javascript
javascript面向对象编程(一) 实例代码
Jun 25 Javascript
JavaScript 和 Java 的区别浅析
Jul 31 Javascript
浅析jQuery(function(){})与(function(){})(jQuery)之间的区别
Jan 09 Javascript
jQuery仿gmail实现fixed布局的方法
May 27 Javascript
jQuery代码实现表格中点击相应行变色功能
May 09 Javascript
Three.js学习之网格
Aug 10 Javascript
Jquery Easyui日历组件Calender使用详解(23)
Dec 18 Javascript
JS数组搜索之折半搜索实现方法分析
Mar 27 Javascript
javascript过滤数组重复元素的实现方法
May 03 Javascript
js判断文件类型大小并给出提示的实现方法
Jan 03 Javascript
原生javascript如何实现共享onload事件
Jul 03 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开发留言板的CRUD(增,删,改,查)操作
2012/04/19 PHP
thinkphp学习笔记之多表查询
2014/07/28 PHP
JavaScript Memoization 让函数也有记忆功能
2011/10/27 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
jquery实现select选中行、列合计示例
2014/04/25 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
javascript学习笔记(一)基础知识
2014/09/30 Javascript
jQuery插件DataTable使用方法详解(.Net平台)
2016/12/22 Javascript
vue.js使用3DES加密的方法示例
2018/05/18 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
2019/04/30 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
[37:23]DOTA2上海特级锦标赛主赛事日 - 3 胜者组第二轮#2Secret VS EG第二局
2016/03/04 DOTA
使用Python判断质数(素数)的简单方法讲解
2016/05/05 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
Python字符串的一些操作方法总结
2019/06/10 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
Python Flask上下文管理机制实例解析
2020/03/16 Python
Python中flatten( ),matrix.A用法说明
2020/07/05 Python
python实现图像外边界跟踪操作
2020/07/13 Python
python 带时区的日期格式化操作
2020/10/23 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
Skyscanner澳大利亚:全球领先的旅游搜索网站
2018/03/24 全球购物
马德里运动鞋商店:Nigra Mercato
2020/02/16 全球购物
阿拉伯时尚购物网站:Nisnass
2021/02/07 全球购物
大学生个人简历中的自我评价
2013/12/27 职场文书
高三英语教学反思
2014/01/13 职场文书
函授毕业生自我鉴定范文
2014/03/25 职场文书
教研处工作方案
2014/05/26 职场文书
小学语文业务学习材料
2014/06/02 职场文书
有关三国演义的读书笔记
2015/06/25 职场文书
2019年工作总结范文
2019/05/21 职场文书
2019年亲子运动会口号
2019/10/11 职场文书
Go语言使用select{}阻塞main函数介绍
2021/04/25 Golang
Python爬虫实战之爬取携程评论
2021/06/02 Python
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
中国古风插画师排行榜:夏达第一,第三是阴阳师姑获鸟皮肤创作者
2022/03/18 国漫