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 tools之tooltip
Jul 25 Javascript
Microsoft Ajax Minifier 压缩javascript的方法
Mar 05 Javascript
JavaScript 内置对象属性及方法集合
Jul 04 Javascript
JS写的贪吃蛇游戏(个人练习)
Jul 08 Javascript
JavaScript的事件绑定(方便不支持js的时候)
Oct 01 Javascript
属于你的jQuery提示框(Tip)插件
Jan 20 Javascript
js ajaxfileupload.js上传报错的解决方法
May 05 Javascript
利用node.js写一个爬取知乎妹纸图的小爬虫
May 03 Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 Javascript
详解为Bootstrap Modal添加拖拽的方法
Jan 05 Javascript
JavaScript this绑定过程深入详解
Dec 07 Javascript
Vue.js+cube-ui(Scroll组件)实现类似头条效果的横向滚动导航条
Jun 24 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实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
PHP实现的方程求解示例分析
2016/11/11 PHP
Laravel框架验证码类用法实例分析
2019/09/11 PHP
PHP中关于php.ini参数优化详解
2020/02/28 PHP
Gird组件 Part-3:范例RSSFeed Viewer
2007/03/10 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
jQuery中hide()方法用法实例
2014/12/24 Javascript
ECMAScript 6即将带给我们新的数组操作方法前瞻
2015/01/06 Javascript
javascript+ajax实现产品页面加载信息
2015/07/09 Javascript
jQuery中常用的遍历函数用法实例总结
2015/09/01 Javascript
JS实现选项卡实例详解
2015/11/17 Javascript
JavaScript实现自动生成网页元素功能(按钮、文本等)
2015/11/21 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
javascript从定义到执行 你不知道的那些事
2016/01/04 Javascript
点击按钮弹出模态框的一系列操作代码实例
2019/03/29 Javascript
详解vue beforeRouteEnter 异步获取数据给实例问题
2019/08/09 Javascript
解决vue scoped scss 无效的问题
2020/09/04 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
如何在vue中使用百度地图添加自定义覆盖物(水波纹)
2020/11/03 Javascript
使用python实现strcmp函数功能示例
2014/03/25 Python
python编写网页爬虫脚本并实现APScheduler调度
2014/07/28 Python
Python实现二叉堆
2016/02/03 Python
python 自动批量打开网页的示例
2019/02/21 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
python图的深度优先和广度优先算法实例分析
2019/10/26 Python
Python类及获取对象属性方法解析
2020/06/15 Python
HTML块级标签汇总(小篇)
2016/07/13 HTML / CSS
Hotter Shoes美国官网:英国最受欢迎的舒适鞋
2018/08/02 全球购物
大整数数相乘的问题
2012/07/22 面试题
2014年上半年工作自我评价
2014/01/18 职场文书
毕业留言寄语大全
2014/04/10 职场文书
图书馆标语
2014/06/19 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
正确使用MySQL INSERT INTO语句
2021/05/26 MySQL
Python爬虫框架之Scrapy中Spider的用法
2021/06/28 Python
python 远程执行命令的详细代码
2022/02/15 Python