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实现个人中心导航菜单效果和美观都非常不错
Sep 02 Javascript
jQuery+PHP实现动态数字展示特效
Mar 14 Javascript
整理Javascript流程控制语句学习笔记
Nov 29 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
Mar 05 Javascript
jquery按回车键实现表单提交的简单实例
May 25 Javascript
angular.js分页代码的实例
Jul 27 Javascript
深入理解AngularJS中的ng-bind-html指令
Mar 27 Javascript
JS排序算法之冒泡排序,选择排序与插入排序实例分析
Dec 13 Javascript
浅析vue给不同环境配置不同打包命令
Aug 17 Javascript
jquery.pager.js分页实现详解
Jul 29 jQuery
解决vue+ element ui 表单验证有值但验证失败问题
Jan 16 Javascript
jdk1.8+vue elementui实现多级菜单功能
Sep 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
SONY SRF-40W电路分析
2021/03/02 无线电
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
非常有用的9个PHP代码片段
2016/04/06 PHP
Yii CGridView用法实例详解
2016/07/12 PHP
浅谈PHP表单提交(POST&amp;GET&amp;URL编/解码)
2017/04/03 PHP
PHP利用百度ai实现文本和图片审核
2019/05/08 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
JQuery操作三大控件(下拉,单选,复选)的方法
2013/08/06 Javascript
javascript 获取iframe里页面中元素值的方法
2014/02/17 Javascript
JavaScript获取网页表单action属性的方法
2015/04/02 Javascript
jQuery插件Slider Revolution实现响应动画滑动图片切换效果
2015/06/05 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
jquery实现文字单行横移或翻转(上下、左右跳转)
2017/01/08 Javascript
nodejs入门教程一:概念与用法简介
2017/04/24 NodeJs
Vuex中mutations与actions的区别详解
2018/03/01 Javascript
vue项目webpack中Npm传递参数配置不同域名接口
2018/06/15 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
从零使用TypeScript开发项目打包发布到npm
2020/02/14 Javascript
Python加pyGame实现的简单拼图游戏实例
2015/05/15 Python
Python使用asyncio包处理并发详解
2017/09/09 Python
Python实现可获取网易页面所有文本信息的网易网络爬虫功能示例
2018/01/15 Python
python制作mysql数据迁移脚本
2019/01/01 Python
对python中词典的values值的修改或新增KEY详解
2019/01/20 Python
Django框架使用内置方法实现登录功能详解
2019/06/12 Python
值类型与引用类型有什么不同?请举例说明?并分别列举几种相应的数据类型
2015/10/24 面试题
C#公司笔试题
2014/03/28 面试题
触电现场处置方案
2014/05/14 职场文书
2014矛盾纠纷排查调处工作总结
2014/12/09 职场文书
2014小学语文教学工作总结
2014/12/17 职场文书
中小企业员工手册范本
2015/05/14 职场文书
怎样写家长意见
2015/06/04 职场文书
Go语言切片前或中间插入项与内置copy()函数详解
2021/04/27 Golang
关于PostgreSQL JSONB的匹配和交集问题
2021/09/14 PostgreSQL
MySQL读取JSON转换的方式
2022/03/18 MySQL
python实现会员信息管理系统(List)
2022/03/18 Python