JavaScript笔记(第四部分)

命 名 空 间 :管理变量,防止污染全局,适用于模块开发

  //   之 前 的 解 决 办 方 (已经不用)--- 命名空间                  
  var org = {
                department1 : {
                  jicheng : {                        
                  name : "abc",                        
                  age : 123                     
                   },                      
                   xuming : { }                   
                   },
                department2 : {                     
                 zhangsan : { },                     
                  lisi : { }                    
                 }                  
 }

(了解即可) 用 法
org.department1.jicheng.name ; — 简化 — var jc = org.department1.jicheng; jc.name;

-------- 真 正 命 名 空 间 的 用 法 -------
-------- with( object ){ } --------------
作 用: 达 到 简 化 代 码 的 作 用
缺 点: 过于强大,能修改作用域链,造成程序效率低下(es5.0 禁止使用它
例如:

    var org = {            
     dp1 : {              
     jc : {               name : 'cheng'               },              
     deng : {               name : 'xaiodeng'              }              
     },            
     dp2 : {               
     wen : {                name : 'wen'               }            
     }    
      }

访问  org.dp1.jc.name
with(org.dp1.jc) {     console.log( name );    }

with 的寻找顺序
先找 自己参数 里的,在找自身所处环境里的,最后在找全局的

         //  用 闭包 可以实现变量私有化,不会污染全局                
          // init ------- 初始化           
           var name = "laodeng";           
           var init = (function () {                                     
           var name = "jicheng";
            function callName () { 
            console.log(name);        
            }
            return function () {    
            callName();   
             }     
             } () );
    //  两个 name 变量互不影响
        init();           
        console.log(name);

零 散 的 知 识 点
实现一个 方法 的 连续调用 ( 模 仿 了 jquery 包里的 链式调用模式 )

var deng = {
        smoke : function () {              
        console.log("i am somking .... xuan cool!!!");              
        return this;            
        },           
         drink : function () {              
         console.log('i am drinking .... ye cool!! ');               
         return this;            
         },            
         perm : function () {              
         console.log('i am perming ... cool!!!');               
         return this;            
         }
       }                
   deng.smoke() .drink()     
 // ----> 此时执行完 smoke() 后,return 返回的是 undefined ,无法继续执行
 // 当 return this 时是可以执行的
// 若想连续执行函数,必须在每个函数里 重新返回 对象          
deng.smoke().drink().perm();

属 性 名 拼 接 问 题
var deng = {
wife1 : {name : ‘xiang liu’},
wife2 : {name : ‘xiao zhang’},
wife3 : {name : ‘xaing meng’},
wife4 : {name : ‘xaing wnag’},
callWife : function (num) { // 实现属性拼接
return this[‘wife’ + num];
}
}

通 常 在 访 问 一 个 对 象 属 性 时 :
一般用法为 : deng.name ------> 实质的隐式转化为 this[ ’ name ’ ]

对 象 的 枚 举 ( 遍 历 ):

  1. for in (简化版的 for 循环)

  2. hasOwnProperty(过滤性方法)(判断当前属性是不是自身的)

  3. in

    扫描二维码关注公众号,回复: 5482472 查看本文章
  4. instanceof

    遍 历 对 象 属 性
    var obj = {
    name : ‘123’,
    age : 123,
    sex : ‘male’,
    height : 180,
    weight : 75,
    proto : {
    lastName : ‘deng’
    }
    }

       1.( for in ) 遍历 对象中所有 属性,自己手动添加都可以遍历   
              
       for (var prop in obj ) {
      // hasOwnProperty()  判断当前属性是否属于自身的方法            
       if(obj.hasOwnProperty(prop)) {         
       // 遍 历 对 象 属 性 必须写 obj[prop] ,不能写 obj.prop             
       console.log( obj[prop]); 
        }                    
       }
    
      2. in ---> (最不常用的遍历法,但是笔试题常考)           
     // 判断 “ ” (字符串)里的属性是否属于 该对象,是就返回 true,           
     // 不分青红皂白,包括员原型的属性也认为是当前对象的属性           
     // 注意: 属性要写在 “ ” 里,不加字符串,认为是变量
     
     console.log( " height " in  obj);
    
      3. instanceof (经常出现,常考)
     // A instanceof B --------> A 对象 是不是 B 构造函数 构造出来的           
      // 看 A 对象的原型链上 有没有 B 的原型,是就 返回 true   
                           
      function Person () { }
      var person = new Person();           
      console.log( person instanceof Person );
      // 区别 数组  对象   ( toString() 和 call () 方法 )
      Object.prototype.toString = function () {                               
      // 识别 this,谁调用 toSrting 的 this 就会指向 谁             
      // 返回相应的结果 
      }             
      Object.prototype.toString.call();
    

------------------ t h i s -----------------------
1.函数预编译过程 tihs ——————> window
2.作用域全局里 tihs ——————> window
3. call / apply 可以改变 tihs 指向
4. obj.func; func() 里面的 this 指向 obj–

------------------ arguments ----------------
------------------ function --------------------

  1. arguments.callee ————————> 指向的是 函数 的 引用(也就是函数本身)
  2. func.caller ————————> 函数自身拥有的,显示出某个函数被调用的环境

arguments.callee() 示例:
// 求阶乘的函数中,要实现调用自身函数,但是自身的函数却没有函数名,
// 在这样的情况下就找不到函数引用,通过 arguments.callee()来解决
var num = (
function (n){
if( n == 1){
return 1;
}
return n*arguments.callee(n-1);
} (3) )

func.caller 示例:
函数自身拥有的,显示出某个函数被调用时的环境
function test (){
demo();
}
function demo (){
console.log(demo.caller);
}
test();

猜你喜欢

转载自blog.csdn.net/weixin_43822185/article/details/88377374