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 代码集(学习js的朋友可以看下)
Jul 22 Javascript
jQuery+PHP实现动态数字展示特效
Mar 14 Javascript
JavaScript数据类型判定的总结笔记
Jul 31 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
Aug 25 Javascript
javascript 正则表达式分组、断言详解
Apr 20 Javascript
axios post提交formdata的实例
Mar 16 Javascript
vue里input根据value改变背景色的实例
Sep 29 Javascript
用jQuery将JavaScript对象转换为querystring查询字符串的方法
Nov 12 jQuery
详解Vue源码之数据的代理访问
Dec 11 Javascript
微信小程序云开发 搭建一个管理小程序
May 17 Javascript
Vue 技巧之控制父类的 slot
Feb 24 Javascript
vue 表单输入框不支持focus及blur事件的解决方案
Nov 17 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也可以?成Shell Script
2006/10/09 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
PHP获取一段文本显示点阵宽度和高度的方法
2015/03/12 PHP
基于PHP实现假装商品限时抢购繁忙的效果
2015/10/16 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
JQuery下关于$.Ready()的分析
2009/12/13 Javascript
Extjs学习过程中新手容易碰到的低级错误积累
2010/02/11 Javascript
简单实现js选项卡切换效果
2017/02/09 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
利用Vue.js+Node.js+MongoDB实现一个博客系统(附源码)
2017/04/24 Javascript
JavaScript之class继承_动力节点Java学院整理
2017/07/03 Javascript
使用JS中的Replace()方法遇到的问题小结
2017/10/20 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
浅谈让你的代码更简短,更整洁,更易读的ES6小技巧
2018/10/25 Javascript
vue前后分离调起微信支付
2019/07/29 Javascript
Vue-CLI 3 scp2自动部署项目至服务器的方法
2020/07/24 Javascript
python运行时间的几种方法
2016/06/17 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
2018/01/11 Python
python2.7 json 转换日期的处理的示例
2018/03/07 Python
python获取代理IP的实例分享
2018/05/07 Python
python 读取.csv文件数据到数组(矩阵)的实例讲解
2018/06/14 Python
python3 http提交json参数并获取返回值的方法
2018/12/19 Python
Python之循环结构
2019/01/15 Python
python定时检测无响应进程并重启的实例代码
2019/04/22 Python
python反转列表的三种方式解析
2019/11/08 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
python爬虫中PhantomJS加载页面的实例方法
2020/11/12 Python
详解使用scrapy进行模拟登陆三种方式
2021/02/21 Python
管理科学大学生求职信
2013/11/13 职场文书
销售员求职个人的自我评价
2014/02/19 职场文书
高中军训感言800字
2014/03/05 职场文书
工商局所长四风自我剖析及整改措施
2014/10/26 职场文书
诚信考试承诺书范文
2015/04/29 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
小学新课改心得体会
2016/01/22 职场文书
js实现自动锁屏功能
2021/06/02 Javascript