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 相关文章推荐
用Javscript实现表单复选框的全选功能
May 25 Javascript
Javascript 判断Flash是否加载完成的代码
Apr 12 Javascript
jQuery中需要注意的细节问题小结
Dec 06 Javascript
jQuery图片滚动图片的效果(另类实现)
Jun 02 Javascript
jQuery动态添加删除select项(实现代码)
Sep 03 Javascript
Firefox和IE兼容性问题及解决方法总结
Oct 08 Javascript
js阻止冒泡及jquery阻止事件冒泡示例介绍
Nov 19 Javascript
JS小功能(checkbox实现全选和全取消)实例代码
Nov 28 Javascript
JavaScript中数组继承的简单示例
Jul 29 Javascript
浅谈JavaScript中setInterval和setTimeout的使用问题
Aug 01 Javascript
JS中动态创建元素的三种方法总结(推荐)
Oct 20 Javascript
详细分析jsonp的原理和实现方式
Nov 20 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
数字转英文
2006/12/06 PHP
php循环输出数据库内容的代码
2008/05/24 PHP
PHP5.3安装Zend Guard Loader图文教程
2014/09/29 PHP
php静态文件返回304技巧分享
2015/01/06 PHP
PHP实现恶意DDOS攻击避免带宽占用问题方法
2015/05/27 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
详解PHP序列化和反序列化原理
2018/01/15 PHP
php中file_get_contents()函数用法实例
2019/02/21 PHP
利用javascript移动div层-javascript 拖动层
2009/03/22 Javascript
js页面跳转常用的几种方式
2010/11/25 Javascript
jquery通过ajax加载一段文本内容的方法
2015/01/15 Javascript
浅谈JSON.parse()和JSON.stringify()
2015/07/14 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
温习Javascript基础语法之词法结构
2016/05/31 Javascript
jQuery UI制作选项卡(tabs)
2016/12/13 Javascript
node.js + socket.io 实现点对点随机匹配聊天
2017/06/30 Javascript
深入理解ES6中let和闭包
2018/02/22 Javascript
vue移动端UI框架实现QQ侧边菜单组件
2018/03/09 Javascript
详解swiper在vue中的应用(以3.0为例)
2018/09/20 Javascript
解决前后端分离 vue+springboot 跨域 session+cookie失效问题
2019/05/13 Javascript
js实现登录时记住密码的方法分析
2020/04/05 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
Vue SPA 首屏优化方案
2021/02/26 Vue.js
理解生产者消费者模型及在Python编程中的运用实例
2016/06/26 Python
Python3单行定义多个变量或赋值方法
2018/07/12 Python
Django的Modelforms用法简介
2019/07/27 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
python和php哪个容易学
2020/06/19 Python
pyqt5实现井字棋的示例代码
2020/12/07 Python
雷锋之歌观后感
2015/06/10 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
Spring中bean的生命周期之getSingleton方法
2021/06/30 Java/Android
Spring Cloud Gateway去掉url前缀
2021/07/15 Java/Android
Spring Data JPA框架Repository自定义实现
2022/04/28 Java/Android