JavaScript的面向对象方法以及差别


Posted in Javascript onMarch 31, 2008

第一种:使用this关键字

function Class1()
{
    this.onclick = function(e)
    {
        for (var i=0; i < 1000; i++)
        {
            var a = new Date();
        }
    } 

使用this.的方法可以很灵活地给对象添加属性和方法,而且和大部分的OOP语言都相似,甚至在运行中都可以添加。

第二种:使用prototype关键字

function clickFunc(e)
{
    for (var i=0; i < 1000; i++)
    {
        var a = new Date();
    }

function Class2()

Class2.prototype.onclick = clickFunc; 

这种用法上来讲就没有第一种显得灵活。不过在一个对象new出来之前,也是一样可以随时添加一个对象的属性和方法。

可是他们并不是相等的,相对来说,我更喜欢第一种,因为第一种方法相对比较集中,比较容易阅读代码。但是在运行的时候,他们运行的效率却差别相当地大。以下让我们看一下测试代码吧:

var total = new Array(); 

function Test1()
{
    var a = new Date();
    for (var i=0; i < 10000; i++)
    {
        var c = new Class1();
        //total.push(c);
    }
    var b = new Date();
    alert(b.getTime()-a.getTime());

function Test2()
{
    var a = new Date();
    for (var i=0; i < 10000; i++)
    {
        var c = new Class2();
        //total.push(c);
    }
    var b = new Date();
    alert(b.getTime()-a.getTime());

第一步作执行时间的测试:发现Test1()需要142ms,而Test2()仅需50ms.发现时间效率上来说,prototype的方法相对this来说,更加高效。 

第二步作内存占用的测试,把total.push(c);这行的注释去掉,之所以要把它们加入到数组里面去,防止创建的时候,对象比较多的时候,没有被引用的对象被GC了。结果发现差距不是一般的大,第一种方法要占用二三十M的内存,而第二种只需要一百多K。

成因推断:
在处理这两种代码的时候,第一种,JS的解析器,给每个对象都创建一个单独的方法,这样增加了内存的开销,同时创建方法的时候,增加了运行时间。第二种,JS的解析器和大部分的OOP编译器一样的,把对象的数据段和方法段分开存储了,对于对象的私有数据,则是每个对象一份,而这些方法,则是放在公共的方法段里,所以可以减少运行时间和内存的开销。

Javascript 相关文章推荐
js身份证验证超强脚本
Oct 26 Javascript
javascript基础知识大集锦(一) 推荐收藏
Jan 13 Javascript
jQuery EasyUI API 中文文档 - ComboGrid 组合表格
Oct 13 Javascript
javascript事件模型实例分析
Jan 30 Javascript
JavaScript操作HTML DOM节点的基础教程
Mar 11 Javascript
深入剖析javascript中的exec与match方法
May 18 Javascript
js制作可以延时消失的菜单
Jan 13 Javascript
JS查找数组中重复元素的方法详解
Jun 14 Javascript
JavaScript中附件预览功能实现详解(推荐)
Aug 15 Javascript
jquery+css实现Tab栏切换的代码实例
May 14 jQuery
Vue v-text指令简单使用方法示例
Sep 19 Javascript
Javascript作用域和作用域链原理解析
Mar 03 Javascript
二行代码解决全部网页木马
Mar 28 #Javascript
通过 Dom 方法提高 innerHTML 性能
Mar 26 #Javascript
js用图作提交按钮或超连接
Mar 26 #Javascript
利用js对象弹出一个层
Mar 26 #Javascript
javascript YUI 读码日记之 YAHOO.util.Dom - Part.4
Mar 22 #Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.3
Mar 22 #Javascript
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
Mar 22 #Javascript
You might like
PHP生成加减算法方式的验证码实例
2018/03/12 PHP
PHP中用Trait封装单例模式的实现
2019/12/18 PHP
CutePsWheel javascript libary 控制输入文本框为可使用滚轮控制的js库
2010/02/07 Javascript
JS小游戏之仙剑翻牌源码详解
2014/09/25 Javascript
JavaScript中的object转换函数toString()与valueOf()介绍
2014/12/31 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
JS的数组迭代方法
2015/02/05 Javascript
jquery插件star-rating.js实现星级评分特效
2015/04/15 Javascript
BootStrap中Datetimepicker和uploadify插件应用实例小结
2016/05/26 Javascript
JavaScript手机振动API
2016/06/11 Javascript
jQuery实现标签页效果实战(4)
2017/02/08 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
2017/03/07 Javascript
利用three.js画一个3D立体的正方体示例代码
2017/11/19 Javascript
在vue项目中,将juery设置为全局变量的方法
2018/09/25 Javascript
纯 JS 实现放大缩小拖拽功能(完整代码)
2019/11/25 Javascript
Javascript原生ajax请求代码实例
2020/02/20 Javascript
24个ES6方法解决JS实际开发问题(小结)
2020/05/31 Javascript
在Python中使用PIL模块处理图像的教程
2015/04/29 Python
Python中datetime常用时间处理方法
2015/06/15 Python
python之virtualenv的简单使用方法(必看篇)
2017/11/25 Python
pycharm中成功运行图片的配置教程
2018/10/28 Python
Python语言检测模块langid和langdetect的使用实例
2019/02/19 Python
Python实现计算文件MD5和SHA1的方法示例
2019/06/11 Python
Django Admin后台模型列表页面如何添加自定义操作按钮
2020/11/11 Python
python开发一个解析protobuf文件的简单编译器
2020/11/17 Python
配置H5的滚动条样式的示例代码
2018/03/09 HTML / CSS
最热门的自我评价
2013/12/30 职场文书
项目合作计划书
2014/01/09 职场文书
社团活动总结范文
2014/04/26 职场文书
绿色小区申报材料
2014/08/22 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
营销计划书
2015/01/17 职场文书
预备党员表决心的话
2015/09/22 职场文书
幼儿园小班开学寄语(2016秋季)
2015/12/03 职场文书
Golang之sync.Pool使用详解
2021/05/06 Golang