JavaScript之对象全面解析

176 阅读3分钟
  • 正如我们熟知,JavaScript中的数据类型包括简单数据类型和对象类型。简单数据类型有num、string、Boolean、null和undefined。简单数据类型比较好理解,现在我们着重来了解一下对象类型。

  • 了解对象,我们可以从对象的创建、检索、更新、引用、原型、反射、枚举、以及对象的删除这些方面来了解它。

  1. 创建对象字面量

    • 定义:一个对象字面量就是在大括号中的零个或者零个以上名值对,可以再任何表达式可以出现的地方出现。(随便看看就行,着重在代码中理解)
    • 代码实现
            var empty_object = {};
            var stooge = {
                //对象中的属性名字如果符合JavaScript的命名规则,则可以不用引号括起来。
                "first-name": Frank,
                last_name: Howard
                //而且属性的值可以从包括另一个对象字面量在内的任意表达式中获得。
                body: {
                    height: 170,
                    birthday:"09-22"
                }
            }
  1. 检索对象。 检索对象有两种方法:
            stooge["first-name"]   //Frink 
            //符合JavaScript的命名规则
            stooge.body.height    //170
            //如果检索一个不存在的属性的值将会返回undefined
            stooge["middle-name"]   //undefined
            //填充默认值
            var middle = stooge["middle-name"] || "(none)"
            //如果从undefined的成员属性中取值会导致typeError异常, 可以通过 &&来解决
            stooge.equipment          //undefined
            stooge.equipment.model    //throw "TypeError"
            stooge.equipment && stooge..equipment.model   //undefined
  1. 更新对象
          //如果属性存在则会直接修改属性的值
          stooge['frist-name'] = 'Sara'
          //如果属性不存在,则会直接在对象中添加该名值对
          stooge['middle-name'] = 'Lester'
  1. 对象的引用 对象可以通过引用来传递,但是永远不会被复制
            var x = stooge
            x['middle-name'] = 'Susar'
            var nick = stooge['middle-name']    //Susar
  1. 原型
* 运行连接在对象属性更新的时候,原型中的属性是不会改变的。但当我们在原型中添加一个新的属性,该属性会立即对基于该原型创建的对象可见 

* 委托:当我们在检索属性的时候,如果对象中没有这个属性,那么JavaScript会从原型中一层一层的寻找,直到到达Object.prototype。如果原型中也没有该属性,最后的结果就是undefined。 

在Object中添加create方法来创建一个使用原对象作为其原型的新对象。
            if(typeof Object.beget !== 'function'){
                Object.create = function (0) {
                    var F = function () {}
                    F.prototype = o
                    return new F();
                }
            }
            var another_stooge = Object.create(stooge)
  1. 反射
        //我们可以用typeof来判断对象中的属性的类型
        typeof stooge.last_name  //'number' 
        //有一些属性的值为function,我们可以通过自己的程序来排除它,也可以用hasOwnProperty()返回一个Boolean值。
         stooge.hasOwnProperty('constructor']  //false 
  1. 枚举 我们可以用两种方法来遍历一个对象中的属性值 for in语句能列出所有的属性以及它的值,所以使用typeof来过滤掉一些不想要的值
            var name;
            for (name in stooge) {
                if(typeof stooge[name] !== 'function') {
                    document.writeln(name + ':' + stooge[name])
                }
            }
* 如果我们需要使属性有一定顺序,我们可以使用一个数组
            var i;
            var properties = {
                'first-name',
                'middle-name'
                last_name
            }
            for(i = 0; i < properties.length; i +=1){
                document.writeln(properties[i] + ':' +stooge[properties[i]])
            }
  1. 删除 删除需要使用delete关键字,但可能会使原型链中的属性显现出来

       delete stooge['first-name']