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 1.0.4 - New Wave Javascript(js源文件)
Jan 15 Javascript
在JQuery dialog里的服务器控件 事件失效问题
Dec 08 Javascript
Javascript中string转date示例代码
Nov 01 Javascript
js运动事件函数详解
Oct 21 Javascript
JavaScript函数表达式详解及实例
May 05 Javascript
基于Node的React图片上传组件实现实例代码
May 10 Javascript
Vue声明式渲染详解
May 17 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
May 22 Javascript
简单了解JavaScript异步
May 23 Javascript
CountUp.js数字滚动插件使用方法详解
Oct 17 Javascript
Vue+abp微信扫码登录的实现代码示例
Jan 06 Javascript
axios解决高并发的方法:axios.all()与axios.spread()的操作
Nov 09 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
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
php生成txt文件标题及内容的方法
2014/01/16 PHP
php cookie中点号(句号)自动转为下划线问题
2014/10/21 PHP
PHP 读取大文件并显示的简单实例(推荐)
2016/08/12 PHP
PHP删除数组中指定下标的元素方法
2018/02/03 PHP
Javascript学习笔记1 数据类型
2010/01/11 Javascript
Javascript实现的类似Google的Div拖动效果代码
2011/08/09 Javascript
firefox浏览器不支持innerText的解决方法
2013/08/07 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
JavaScript模块化开发之SeaJS
2015/12/13 Javascript
js智能获取浏览器版本UA信息的方法
2016/08/08 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
VUE + UEditor 单图片跨域上传功能的实现方法
2018/02/08 Javascript
Vue编写可显示周和月模式的日历 Vue自定义日历内容的显示
2019/06/26 Javascript
js刷新页面location.reload()用法详解
2019/12/09 Javascript
[36:09]Secret vs VG 2019国际邀请赛淘汰赛 败者组 BO3 第一场 8.24
2019/09/10 DOTA
利用Python代码实现数据可视化的5种方法详解
2018/03/25 Python
Python代码使用 Pyftpdlib实现FTP服务器功能
2019/07/22 Python
Django将默认的SQLite更换为MySQL的实现
2019/11/18 Python
python实现按关键字筛选日志文件
2019/12/24 Python
python中文分词库jieba使用方法详解
2020/02/11 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
微软中国官方旗舰店:销售Surface、Xbox One、笔记本电脑、Office
2018/07/23 全球购物
门卫班长岗位职责
2013/12/15 职场文书
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
庆八一活动方案
2014/01/25 职场文书
九年级物理教学反思
2014/01/29 职场文书
《陋室铭》教学反思
2014/02/26 职场文书
安全责任书范文
2014/03/12 职场文书
献爱心倡议书
2014/04/14 职场文书
学生党员一帮一活动总结
2014/07/08 职场文书
秋季运动会演讲稿
2014/09/16 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
向女朋友道歉的话
2015/01/20 职场文书
财政局个人总结
2015/03/04 职场文书
大学学生会辞职信
2015/05/13 职场文书