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实现table隔行换色和鼠标经过变色的两种方法
Jun 15 Javascript
kindeditor修复会替换script内容的问题
Apr 03 Javascript
关于JS中prototype的理解
Sep 07 Javascript
谈一谈jQuery核心架构设计
Mar 28 Javascript
JavaScript中的this使用详解
Jul 27 Javascript
BootStrap下拉框在firefox浏览器界面不友好的解决方案
Aug 18 Javascript
适用于手机端的jQuery图片滑块动画
Dec 09 Javascript
angular5 子组件监听父组件传入值的变化方法
Sep 30 Javascript
使用vue完成微信公众号网页小记(推荐)
Apr 28 Javascript
基于vue实现图片验证码倒计时60s功能
Dec 10 Javascript
JS手写一个自定义Promise操作示例
Mar 16 Javascript
深入浅析JavaScript中的in关键字和for-in循环
Apr 20 Javascript
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的安全
2006/10/09 PHP
php中获取指定IP的物理地址的代码(正则表达式)
2011/06/23 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
2013/01/06 PHP
一个经典实用的PHP图像处理类分享
2014/11/18 PHP
PHP Opcache安装和配置方法介绍
2015/05/28 PHP
PHP常见的6个错误提示及解决方法
2016/07/07 PHP
php如何实现不借助IDE快速定位行数或者方法定义的文件和位置
2017/01/17 PHP
SharePoint 客户端对象模型 (一) ECMA Script
2011/05/22 Javascript
js sort 二维数组排序的用法小结
2014/01/24 Javascript
浅谈Javascript Base64 加密解密
2014/12/28 Javascript
JS实现适合于后台使用的动画折叠菜单效果
2015/09/21 Javascript
微信小程序 动态的设置图片的高度和宽度详解及实例代码
2017/02/24 Javascript
JS实现简单拖拽效果
2017/06/21 Javascript
mescroll.js上拉加载下拉刷新组件使用详解
2017/11/13 Javascript
浅谈webpack组织模块的原理
2018/03/10 Javascript
jQuery 实现批量提交表格多行数据的方法
2018/08/09 jQuery
vue实现计步器功能
2019/11/01 Javascript
Vue data的数据响应式到底是如何实现的
2020/02/11 Javascript
node运行js获得输出的三种方式示例详解
2020/07/02 Javascript
跟老齐学Python之数据类型总结
2014/09/24 Python
Django中ORM表的创建和增删改查方法示例
2017/11/15 Python
详解pandas如何去掉、过滤数据集中的某些值或者某些行?
2019/05/15 Python
python实现感知机线性分类模型示例代码
2019/06/02 Python
Python Gitlab Api 使用方法
2019/08/28 Python
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
屈臣氏马来西亚官网:Watsons马来西亚
2019/06/15 全球购物
外贸学院会计专业应届生求职信
2013/11/14 职场文书
服务生自我鉴定
2014/01/22 职场文书
小学教师培训感言
2014/02/11 职场文书
食品安全工作实施方案
2014/03/26 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
写给女朋友的检讨书
2015/05/06 职场文书
导游词之神仙居景区
2019/11/15 职场文书
使用HTML+Css+transform实现3D导航栏的示例代码
2021/03/31 HTML / CSS
简单谈谈Python面向对象的相关知识
2021/06/28 Python