1. 用object.hasOwnProperty(variable)来确定这个属性名是否为该对象成员,还是来自于原型链。

    for(my in obj){
    if(obj.hasOwnProperty(my)){
    ...
    }
    }

    思考:--用来遍历判断是否有该属性成员,当为一个string var="abcdef"一样的一个字符串时,通过JS代码判断其中是否含有我们需要的某一个字符,比如a,如果有就将其remove

  2. 一个属性存取表达式用于指定一个对象或数组的属性或元素。
  3. 对象字面量:一个对象字面量就是包围在一堆花括号中的0或多个“名/值”对。
    var empty_st={};
    var st={
    "f":"hello",
    "l":"word"
    }
    //进行调用
    st["f"] //"hello"
    //当然也可嵌套
    var flagt={
    airline:"Oceanic",
    number:11,
    departue:{
    time:"2015",
    city:"Shanghai"
    }
    };

    JavaScript可以随意的定义全局变量来容纳你的需要的资源,但是这样会削弱程序的灵活性,尽量避免使用,还是尽可能使用上面的那种嵌套形式,这样flagt就变成了一个容器,还且容易看出层次结构.

  4. 每个函数在创建的时候会附加两个隐藏属性:函数的上下文和实现函数行为的代码。每个函数对象在创建的时候也会随机配 有一个prototype属性,他的值是一个拥有constructor属性且值即为该函数的对象。
  5. 函数对象通过函数字面量来创建
    //创建一个名为add的变量,并用来把两个数字相加的函数赋值给它
    var add=function(a,b){
    return a+b;
    }

    该函数是个匿名函数。

  6. 函数的调用模式有四种:方法调用模式,函数调用模式,构造器调用模式,apply调用模式。除了声明的时候定义的形参,每个函数还接受两个附加的参数:this和arguments。
  7. 闭包:

    a:要理解闭包,首先必须理解Javascript特殊的变量作用域。

    变量的作用域无非就是两种:全局变量和局部变量。

    Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。

    var n=999;
      function f1(){
        alert(n);
      }
      f1(); //
    //另一方面,在函数外部自然无法读取函数内的局部变量。
      function f1(){
        var n=999;
      }
      alert(n); // error
    /*这里有一个地方需要注意,函数内部声明变量的时候,一定要使用var命令。如果不用的话,你实际上声明了一个全局变量!*/
      function f1(){
        n=999;
      }
      f1();
      alert(n); //

    b:如何从外部读取局部变量

    出于种种原因,我们有时候需要得到函数内的局部变量。但是,前面已经说过了,正常情况下,这是办不到的,只有通过变通方法才能实现。

    那就是在函数的内部,再定义一个函数。

    function f1(){
        n=999;
        function f2(){
          alert(n); //
        }
      }

    在上面的代码中,函数f2就被包括在函数f1内部,这时f1内部的所有局部变量,对f2都是可见的。但是反过来就不行,f2内部的局部变量,对f1 就是不可见的。这就是Javascript语言特有的“链式作用域”结构(chain scope),

    子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

    既然f2可以读取f1中的局部变量,那么只要把f2作为返回值,我们不就可以在f1外部读取它的内部变量了吗!

    function f1(){
        n=999;
        function f2(){
          alert(n);
        }
        return f2;
      }
      var result=f1();
      result(); //

    闭包有什么用?1:取函数内部的变量   2:让这些变量的值始终保持在内存中

    function f1(){
        var n=999;
        nAdd=function(){n+=1}
        function f2(){
          alert(n);
        }
        return f2;
      }
      var result=f1();
      result(); //
      nAdd();
      result(); //

    在这段代码中,result实际上就是闭包f2函数。它一共运行了两次,第一次的值是999,第二次的值是1000。这证明了,函数f1中的局部变量n一直保存在内存中,并没有在f1调用后被自动清除。

    为什么会这样呢?原因就在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

    这段代码中另一个值得注意的地方,就是“nAdd=function(){n+=1}”这一行,首先在nAdd前面没有使用var关键字,因此 nAdd是一个全局变量,而不是局部变量。其次,nAdd的值是一个匿名函数(anonymous function),而这个

    匿名函数本身也是一个闭包,所以nAdd相当于是一个setter,可以在函数外部对函数内部的局部变量进行操作。

   既然是这么好的东西,那在使用过程中有没有需要注意的地方呢?很明显有!

      注意:

    1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

    2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便

改变父函数内部变量的值。

JavaScript语言精粹之对象的更多相关文章

  1. 阅读笔记《JavaScript语言精粹》

    阅读笔记<JavaScript语言精粹> 对象 1.检索属性 使用[]和. 2.引用传递 JavaScript的简单数据类型包括数字.字符串.布尔值.null值和undefined值.其它 ...

  2. JavaScript中对象与函数的某些事[JavaScript语言精粹-N1]

    今天在读<JavaScript语言精粹>的时候,关于函数的一个部分,始终觉得有点难以理解,代码如下: 1: var obj = (function(){ 2: var value = 0; ...

  3. JavaScript语言精粹 笔记01 语法 对象

    内容比较简单,只是从头梳理一下JS的知识 语法空白标识符数字字符串语句 对象对象字面量检索更新引用原型反射枚举删除减少全局变量污染  语法 1 空白 空白可能表现为格式化字符或注释的形式.空白通常没有 ...

  4. 《JavaScript语言精粹》小记

    一.前言 以下内容均摘自<JavaScript语言精粹>一书,本人在读这本书时,发现作者诠释JavaScript很犀利,特别是数组部分,固记录下来,想和大家分享下. 随笔主要包含两大部分: ...

  5. javascript语言精粹

    内容选自:<javascript语言精粹> 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'num ...

  6. Javascript 语言精粹 代码片段合集

    Javascript 语言精粹 代码片段合集 标签:Douglas-Crockford Javascript 最佳实践 原文链接 更好的阅读体验 使用一个method 方法定义新方法 Function ...

  7. JavaScript语言精粹笔记

    JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取 ...

  8. 《JavaScript语言精粹》之函数化

    写在前面 看到好多书评和读书笔记都说<JavaScript语言精粹>字字珠玑,名不虚传..当然,要看得懂才行 其实个人认为函数化部分不是很好,举的例子不是十分恰当,之前看不懂是因为被成功误 ...

  9. 《JavaScript语言精粹》学习笔记

    一.in的用法 for...in 枚举一个对象的所有可枚举属性 检测DOM/BOM属性 if ("onclick" in elem) { // 元素支持onclick } if ( ...

随机推荐

  1. NUMA总结。

    vsphere 5.1性能最佳实践http://www.vmware.com/pdf/Perf_Best_Practices_vSphere5.1.pdf vNUMA 要求:硬件版本8以上. 1.整个 ...

  2. Windows平台查看端口占用的程序

    一.方法:管理员权限打开Cmd窗口:netstat -obna

  3. ThreadLocal与Synchronized

    package com.demo; import org.hibernate.HibernateException; import org.hibernate.classic.Session; imp ...

  4. Linux安装nginx并设置https(openssl

    一.安装依赖包 1.$sudo apt-get install openssl    或者$sudo apt-get install libssl-dev 2.$sudo apt-get instal ...

  5. 通过Navicat Premium迁移Oracle到EDB迁移实战

    1.1 DB migration analysis   在从Oracle向EDB迁移数据之前,须要做非常多准备工作.比方须要分析源数据库数据量大小.数据是否稳定.异构数据库兼容.编码方式.业务逻辑(存 ...

  6. cpan安装报错Invalid host name on line 1 at *FirstTime.pm line 1857.

    今天鼓捣一下CPAN,安装时出错: root@ubuntu:~# cpan install DBI CPAN.pm requires configuration, but most of it can ...

  7. win7 远程桌面连接centos 6.5

    首先安装tigervnc-server: yum install tigervnc-server 安装好后,设置 vi /etc/sysconfig/vncservers 'man vncpasswd ...

  8. mysql8.x开启远程登录

    mysql8.x密码的认证方式变了,需要修改远程认证方式 问题描述 Connection to lab-130-mysql failed.Unable to load authentication p ...

  9. Easyui入门视频教程 第04集---Easyui布局

    目录 目录 ----------------------- Easyui入门视频教程 第09集---登录完善 图标自定义   Easyui入门视频教程 第08集---登录实现 ajax button的 ...

  10. @Transactional注解事务不回滚不起作用无效

     写在前面 数据库Mysql8.0 添加@Transactional注解后事务并未起作用. 修改表的引擎后ok了.(详看下面转载内容) ================================ ...