zoukankan      html  css  js  c++  java
  • JS Prototype

    从对象创建一个实例说起来貌似是很简单的东西,是啊,基本在所有的语言中,都是用new关键字来创建实例的,Javascript当然也不例外,可是关于对象的引用问题,你考虑过么?通常的做法是一系列对象共享类的方法,而不是为每个对象复制一份函数。下面看看为每个对象复制一份函数的做法。

    Code

    看起来不错,用起来也不错,对象之间互相没有任何干扰,也能正常完成工作,一切看起来理所当然,但是你每次产生一个新对象的时候,脚本引擎都会给对象复制一份属性和方法,有没有觉得这样很浪费内存呢?在客户端的这种对象的复制方式,极其容易造成内存泄露,因为每次产生新的实例都会复制所有的属性和方法,占用大量的内存。
    在大型JavaScript应用中首先考虑的就是内存问题。
    正确的使用方法是用prototype关键字来定义一个类的方法或者属性

    Code

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

    看看JavaScript中的对象扩展

    Code

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

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

    Code

    PS:JS中的闭包

    var abc = function(y) {
    var x
    = y; // 这个是局部变量
    return function() {
    alert(x
    ++); // 就是这里调用了闭包特性中的一级函数局部变量的x,并对它进行操作
    alert(y--); // 引用的参数变量也是自由变量
    }
    } (
    5); // 初始化
    abc(); // "5" "5"
    abc(); // "6" "4"
    abc(); // "7" "3"
    alert(x); // 报错!“x”未定义!
  • 相关阅读:
    respons——文件下载
    李珊珊(为奥运冠军名字作诗)
    林跃/火亮(为奥运冠军名字作诗)
    张湘祥(为奥运冠军名字作诗)
    何可欣(为奥运冠军名字作诗)
    李小鹏(为奥运冠军名字作诗)
    王鑫(为奥运冠军名字作诗)
    杨伊琳(为奥运冠军名字作诗)
    江钰源(为奥运冠军名字作诗)
    黄旭(为奥运冠军名字作诗)
  • 原文地址:https://www.cnblogs.com/lhking/p/1457237.html
Copyright © 2011-2022 走看看