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 相关文章推荐
js电信网通双线自动选择技巧
Nov 18 Javascript
Extjs学习笔记之七 布局
Jan 08 Javascript
返回页面顶部top按钮通过锚点实现(自写)
Aug 30 Javascript
window.onload追加函数使用示例
Mar 03 Javascript
javascript实现十六进制颜色值(HEX)和RGB格式相互转换
Jun 20 Javascript
BootStrap表单验证实例代码
Jan 13 Javascript
详解Vue2.x-directive的学习笔记
Jul 17 Javascript
JavaScript的数据类型转换原则(干货)
Mar 15 Javascript
jQuery实现的响应鼠标移动方向插件用法示例【附源码下载】
Aug 28 jQuery
elementUI Vue 单个按钮显示和隐藏的变换功能(两种方法)
Sep 04 Javascript
vue-cli 3.0 版本与3.0以下版本在搭建项目时的区别详解
Dec 11 Javascript
基于node+vue实现简单的WebSocket聊天功能
Feb 01 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代码优化之成员变量获取速度对比
2014/02/28 PHP
PHP ignore_user_abort函数详细介绍和使用实例
2014/07/15 PHP
WordPress中对访客评论功能的一些优化方法
2015/11/24 PHP
PHP生成各种常见验证码和Ajax验证过程
2016/01/10 PHP
详解PHP使用Redis存储session时的一个Warning定位
2017/07/05 PHP
thinkPHP5框架设置404、403等http状态页面的方法
2018/06/05 PHP
php实现算术验证码功能
2018/12/05 PHP
js调试系列 初识控制台
2014/06/18 Javascript
jfreechart插件将数据展示成饼状图、柱状图和折线图
2015/04/13 Javascript
javascript实现倒计时(精确到秒)
2015/06/26 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
详解JavaScript中的自定义事件编写
2016/05/10 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
全面解析node 表单的图片上传
2016/11/21 Javascript
JavaScript中创建对象的7种模式详解
2017/02/21 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
python 算法 排序实现快速排序
2012/06/05 Python
python写日志封装类实例
2015/06/28 Python
python实现二维码扫码自动登录淘宝
2016/12/27 Python
Python正则表达式如何进行字符串替换实例
2016/12/28 Python
python实现画一颗树和一片森林
2018/06/25 Python
Python测试模块doctest使用解析
2019/08/10 Python
Python bytes string相互转换过程解析
2020/03/05 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
2020/04/17 Python
html5使用canvas画一条线
2014/12/15 HTML / CSS
打印机墨盒:123Inkjets
2017/02/16 全球购物
Nº21官方在线商店:numeroventuno.com
2019/09/26 全球购物
介绍一下Linux内核的排队自旋锁
2014/08/27 面试题
Java基础面试题
2014/07/19 面试题
信用社实习人员自我鉴定
2013/09/20 职场文书
垃圾桶标语
2014/06/24 职场文书
个人借款协议书范本
2014/11/17 职场文书
一文读懂navicat for mysql基础知识
2021/05/31 MySQL