zoukankan      html  css  js  c++  java
  • javascript命名空间及对象枚举的理解

    命名空间的意思是管理变量,防止污染全局,适用于模块化开发

    以前的做法(现在不在使用)

    var obj = {
      department1: {
        lyj: '',
        ...
      },
      department2: {
        ccc: ''
      },
      ...
    }

    现在新的方法(闭包)

    var initDeng = (function() {
      var name = 'abc'
      function callName() {
        console.log(name)
      }
      return function() {
        callName()
      }
    }())
    var initZhang = (function() {
      var name = 'def'
      function callName() {
        console.log(name)
      }
      return function() {
        callName()
      }
    }())
    initDeng() //abc
    initZhang() //def
    //里面的name互不影响

    看下面代码(模仿Jquery链式反应)

    var deng = {
      smoke: function() {
        console.log('smoke')
        return this
      },
      drink: function() {
        console.log('drink')
        return this
      },
      perm: function() {
        console.log('perm')
        return this
      }
    }
    deng.smoke().drink().perm()
    //模仿jQuery的链式调用,原理是在方法内return this

    对象枚举 (for in

    var obj = {
      name: 'lyj',
      sex: '男',
      age: 18
    }
    for(var key in obj) {
      console.log(key)
      console.log(obj[key])
    }

    再看一下例子

    var obj = {
      name: 'lyj',
      sex: '男',
      age: 18,
      __proto__: {
        lastName: 'li'
      }
    }
    Object.prototype.firstNmae = 'yingjie'
    for(var key in obj) {
      // console.log(key)
      // console.log(obj[key])  //会打印出原型链上的属性和值
    
      if(obj.hasOwnProperty(key)) {  //过滤是否是自己身上的属性
        console.log(key)      //不会打印出原型链上的属性和值
        console.log(obj[key])   } }
    //最好for in 和 hasOwnProperty一起使用,为了过滤出自己身上的属性

    in 操作符(基本不常用), 判断是否是对象的属性

    var obj = {
      name: 'lyj',
      sex: '男',
      age: 18,
      __proto__: {
        lastName: 'li'
      }
    }
    Object.prototype.firstNmae = 'yingjie'
    console.log('name' in obj)      //true
    console.log('abc' in obj)       //false
    console.log('lastName' in obj)  //true
    console.log('firstNmae' in obj) //true

    instanceof
    a instanceof A 判断对象a的原型链上 是否有 A的原型(A.prototype)

    function Person() {
    
    }
    var person = new Person()
    console.log(person instanceof Person)  //true
    console.log(person instanceof Object)  //true
    console.log([] instanceof Array)   //true
    console.log([] instanceof Object)  //true
    console.log({} instanceof Object)  //true
    console.log({} instanceof Array)   //false

    判断输数值还是对象三种方法

    var a = []  
    var b = {}
    
    //1. constructor
    console.log(a.constructor)  //Array
    console.log(b.constructor)  //Object
    
    //2. instanceof
    console.log(a instanceof Array)  //true
    console.log(b instanceof Array)  //false
    
    //3. toString
    console.log(a.toString())  //
    console.log(b.toString())  //[object Object]
    
    //原理
    Object.prototype.toString = function() {
      // 识别this
      // 返回结果
    }

    再看下面例子区别基本类型和引用类型

    console.log(Object.prototype.toString.call()) //[object Undefined]
    console.log(Object.prototype.toString.call({})) //[object Object]
    console.log(Object.prototype.toString.call([])) //[object Array]
    console.log(Object.prototype.toString.call(123)) //[object Number]
    console.log(Object.prototype.toString.call(true)) //[object Boolean]

    call的参数1改变this,返回对应this类型toString方法

    end !!!

  • 相关阅读:
    POJ3164 Command Network
    UVa11401 Triangle Counting
    UVa11174 Stand in a Line
    UVa11806 Cheerleaders
    Uva11538 Chess Queen
    Bzoj3130 [Sdoi2013]费用流
    Bzoj3262 陌上花开
    模拟25A 题解
    模拟24 题解
    模拟23 题解
  • 原文地址:https://www.cnblogs.com/lyjfight/p/13815707.html
Copyright © 2011-2022 走看看