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下扩展插件和拓展函数的写法(匿名函数使用的典型例子)
Oct 20 Javascript
原生js ActiveXObject获取execl里面的值
Nov 01 Javascript
js点击事件链接的问题解决
Apr 25 Javascript
node.js中的http.createClient方法使用说明
Dec 15 Javascript
JavaScript动态添加列的方法
Mar 25 Javascript
Node.js巧妙实现Web应用代码热更新
Oct 22 Javascript
整理Javascript基础语法学习笔记
Nov 29 Javascript
JS中的forEach、$.each、map方法推荐
Apr 05 Javascript
JS/jQuery判断DOM节点是否存在的简单方法
Nov 24 Javascript
JS实现AES加密并与PHP互通的方法分析
Apr 19 Javascript
jquery ajax异步提交表单数据的方法
Oct 27 jQuery
vue的项目如何打包上线
Apr 13 Vue.js
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项目开发中最常用的自定义函数整理
2010/12/02 PHP
Mac系统下使用brew搭建PHP(LNMP/LAMP)开发环境
2015/03/03 PHP
thinkPHP简单导入和使用阿里云OSSsdk的方法
2017/03/15 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
通过身份证号得到出生日期和性别的js代码
2009/11/23 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
chrome不支持form.submit的解决方案
2015/04/28 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
jQuery实现动态表单验证时文本框抖动效果完整实例
2015/08/21 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
2016/07/05 Javascript
在js里怎么实现Xcode里的callFuncN方法(详解)
2016/11/05 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
vue的mixins属性详解
2018/03/14 Javascript
使用electron制作满屏心特效的示例代码
2018/11/27 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
VUE 实现动态给对象增加属性,并触发视图更新操作示例
2019/11/29 Javascript
JavaScript实时更新当前的时间的示例代码
2020/07/15 Javascript
[01:05:32]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#1COL VS Alliance第一局
2016/03/04 DOTA
python网络爬虫学习笔记(1)
2018/04/09 Python
python和opencv实现抠图
2018/07/18 Python
Python设计模式之职责链模式原理与用法实例分析
2019/01/11 Python
django 实现简单的插入视频
2020/04/07 Python
html5视频播放_动力节点Java学院整理
2017/07/13 HTML / CSS
台湾旅游网站:雄狮旅游网
2017/08/16 全球购物
怀旧收藏品和经典纪念品:Betty’s Attic
2018/08/29 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
夜班门卫岗位职责
2013/12/09 职场文书
管理标语大全
2014/06/24 职场文书
党员剖析材料范文
2014/09/30 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
解决Vue+SpringBoot+Shiro跨域问题
2021/06/09 Vue.js
聊一聊Redis与MySQL双写一致性如何保证
2021/06/26 Redis
详解Flutter网络请求Dio库的使用及封装
2022/04/14 Java/Android
element tree树形组件回显数据问题解决
2022/08/14 Javascript