javascript Prototype 对象扩展


Posted in Javascript onMay 15, 2009

Javascript当然也不例外,可是关于对象的引用问题,你考虑过么?通常的做法是一系列对象共享类的方法,而不是为每个对象复制一份函数。下面看看为每个对象复制一份函数的做法。

var myobject=function(param1,param2) 
{ 
this.name=param1; 
this.age=param2; 
this.showmsg=function() 
{ 
alert("name:"+this.name+"\n"+"age:"+this.age); 
} 
} 
var objectone=new myobject('liu',20); 
alert(objectone.name); //liu 
var objecttwo=new myobject('lin',20); 
alert(objecttwo.name); //lin 
alert(objecttwo.showmsg()); 
var objectthree=new myobject('lhking',22); 
alert(objectthree.showmsg());

看起来不错,用起来也不错,对象之间互相没有任何干扰,也能正常完成工作,一切看起来理所当然,但是你每次产生一个新对象的时候,脚本引擎都会给对象复制一份属性和方法,有没有觉得这样很浪费内存呢?在客户端的这种对象的复制方式,极其容易造成内存泄露,因为每次产生新的实例都会复制所有的属性和方法,占用大量的内存。
在大型JavaScript应用中首先考虑的就是内存问题。
正确的使用方法是用prototype关键字来定义一个类的方法或者属性
var myobject=function(param1,param2) 
{ 
this.name=param1; 
this.age=param2; 
myobject.prototype.showmsg=function() 
{ 
alert("name:"+this.name+"\n"+"age:"+this.age); 
} 
} 
var objectone=new myobject('liu',20); 
alert(objectone.name); 
var objecttwo=new myobject('lin',20); 
alert(objecttwo.name); 
alert(objecttwo.showmsg()); 
var objectthree=new myobject('lhking',22); 
alert(objectthree.showmsg);

这样的话,你创建的对象之间可以共用方法,也就是showmsg()函数只定义一次,其它的对象共用这一个方法,而不是复制出自己的方法。
Javascript中的prototype已经说完。

看看JavaScript中的对象扩展

function rand(x) 
{ 
return Math.ceil(Math.random()*x); 
} 
生成随机数组的一个扩展方法 
Array.prototype.random=function() 
{ 
for(var i=(this.length-1);i>1;i--) 
{ 
var j=rand(this.length-1); 
var cache=this[i]; 
this[i]=this[j]; 
this[j]=cache; 
} 
} 
var array=new Array("1","2","3","4","5"); 
for(var a in array) 
{ 
alert(array[a]); 
} 
array.random(); 
for(var b in array) 
{ 
alert(array[b]); 
}

再看看对象反射
反射是一种对象的机制,它允许你在完全不了解对象的情况下了解它的属性和方法,通常情况下,程序员对于自己所操纵的对象是如何组成的是非常了解的,但是在某些特殊情况下使用某个其他人写的复杂的对象的时候,我们需要快速了解这个对象的属性和方法,就需要用到反射的机制,当然反射的应用并不是局限于此,这里只是介绍反射在Javascript中的使用方法.

首先我们可能想知道在某个对象中是否存在一个特定的属性或者方法,这时候我们可以地测试它:
if(typeof(myobject.someproperty)!="undefined")
{
}
在Javascript中如果没有定义一个对象或者变量的话,它总是返回undefined类型.
也可以用其他的内建类来缩小测试范围:
if(myobject instanceof Object)
{
}
instanceof 是用来测试内建类或者自定义类的操作符,内建类指Array,String,Date,Number,Math,RegExp,Boolean,Function之类的内建类.例如:Function和Array都是继承自Object类的,所以如果你在代码中如果测试某个Array对象的话,如果你先测试它是否是Object,将返回true,如果测试它是否是Array的话,它也会返回true。

一个更简单而有用的方法,是遍历一个对象的所有属性和方法来快速了解一个对象的内部状态:

function myobject(){ 
this.name="name"; 
this.age="age"; 
this.sex="sex"; 
this.func=function(){ 
} 
} 
var myobj=new myobject(); 
for(var i in myobj){ 
alert(myobj[i]); 
}
Javascript 相关文章推荐
Jquery 常用方法经典总结
Jan 28 Javascript
THREE.JS入门教程(5)你应当知道的十件事
Jan 24 Javascript
javascript:void(0)使用探讨
Aug 27 Javascript
js获取当前月的第一天和最后一天的小例子
Nov 18 Javascript
jquery点击展示与隐藏更多内容
Dec 03 Javascript
react开发中如何使用require.ensure加载es6风格的组件
May 09 Javascript
解决vue 按钮多次点击重复提交数据问题
May 10 Javascript
vue项目base64字符串转图片的实现代码
Jul 13 Javascript
JS实现灯泡开关特效
Mar 30 Javascript
浅谈vue-router路由切换 组件重用挖下的坑
Nov 01 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
Nov 25 Javascript
jQuery实现简易聊天框
Feb 08 jQuery
JavaScript设置FieldSet展开与收缩
May 15 #Javascript
childNodes.length与children.length的区别
May 14 #Javascript
DOM下的节点属性和操作小结
May 14 #Javascript
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
May 14 #Javascript
JavaScript 动态将数字金额转化为中文大写金额
May 14 #Javascript
JS面向对象、prototype、call()、apply()
May 14 #Javascript
JavaScript Date对象使用总结
May 14 #Javascript
You might like
PHP连接MongoDB示例代码
2012/09/06 PHP
php导入导出excel实例
2013/10/25 PHP
php利用事务处理转账问题
2015/04/22 PHP
javascript高亮效果的二种实现方法
2008/09/14 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
js中更短的 Array 类型转换
2011/10/30 Javascript
js实现带搜索功能的下拉框实时搜索实时匹配
2013/11/05 Javascript
javascript数组操作总结和属性、方法介绍
2014/04/05 Javascript
Egret引擎开发指南之运行项目
2014/09/03 Javascript
JavaScript检测鼠标移动方向的方法
2015/05/22 Javascript
理解javascript中DOM事件
2015/12/25 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
jQuery实现键盘回车搜索功能
2017/07/25 jQuery
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
vue 项目常用加载器及配置详解
2018/01/22 Javascript
ES6 如何改变JS内置行为的代理与反射
2019/02/11 Javascript
Javascript之高级数组API的使用实例
2019/03/08 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
解决antd datepicker 获取时间默认少8个小时的问题
2020/10/29 Javascript
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python3实现对列表按元组指定列进行排序的方法分析
2018/12/22 Python
python3+selenium自动化测试框架详解
2019/03/17 Python
Python super()函数使用及多重继承
2020/05/06 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
Footshop罗马尼亚:最好的运动鞋选择
2019/09/10 全球购物
美国相机和电子产品零售商:Beach Camera
2020/11/26 全球购物
个人实用的自我评价范文
2013/11/23 职场文书
餐厅总经理岗位职责
2013/12/31 职场文书
大学教师师德师风演讲稿
2014/08/22 职场文书
个人年终总结怎么写
2015/03/09 职场文书
最感人的道歉情书
2015/05/12 职场文书
解约证明模板
2015/06/19 职场文书
周一问候语大全
2015/11/10 职场文书
java.util.NoSuchElementException原因及两种解决方法
2022/06/28 Java/Android