《js精粹》-读书笔记02

171 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情

第3章 对象

  • js中的对象是可变的键控集合。除简单数据类型以外的值都是对象。数组、函数、正则表达式皆为对象。

  • 对象是属性的容器,属性拥有名字和值,属性名可是任意字符串,属性名可是除undefined以外的任何值

对象字面量

创建新对象值的表示法: 一个对象字面量-在一对花括号中的0或多个“名/值”对。
对象字面量可出现在任何允许表达式出现的地方。

var empty_object = {};
var stooge = {
    "first-name": "Jason",
    "last-name": "Howard"
};

对象是可嵌套的,属性值可从另一个对象字面量在内的任意表达式中获得,属性名不强制引号

var people = {
    name: "Jason",
    age: 12,
    hasDog:{
        name: "bob",
        age: 1
    }
}

检索

  • 如要检索对象里包含的值,可用[] 和 . 表示
    stooge["first-name"]  // "Jason"
    people.hasDog.name.  //  "bob"
  • 如若检索不存在的成员属性,将返回undefined
    stooge["middle-name"]  // undefined
    people.status         // undefined
  • || 运算符可用于填充默认值
    var middle = stooge["middle-name"] || "none";
    var status = people.status || "unknown";
  • 从undefined的成员属性中取值会导致TypeError异常,可用&&避免错误
    people.job  // undefined
    people.job.type  // throw"TypeError"
    people.job && people.job.type  //undefined

更新

  • 对象里的值可通过赋值语句来更新。
  • 如属性名存在于对象里,属性值会被替换
   stooge['first-name'] = 'July'
  • 如属性名不存在,该属性便新增到对象中
    stooge['middle-name'] = 'Lester'
    people.job = {
        type: '996'
    }

引用

  • 对象通过引用来传递
    var x = stooge;
    x.nickname = 'Curly';
    var nick = stooge.nickname; // 因 x 和 stooge 指向同一对象的引用,so nick为'Curly'
    
    var a = {}, b = {}, c = {}; // a、b和c 都引用不同的空对象
    a=b=c={};  // a、b和c 都引用同一个空对象

原型

  • 每个对象都可连接到一个原型对象,并继承属性
  • 所有通过对象字面量创建的对象都连接到 object.prototype
    object.create 方法创建一个使用原对象作其原型的新对象
    if(typeof Object.beget !== 'function'){
        Object.create = function(o){
            var F = function(){};
            F.prototype = o;
            return new F();
        }
    }
    var another_stooge = Object.create(stooge);

原型链:去获取对象的某个属性值,但没有此属性名,js会从原型对象中获取属性值,如原型对象也没有,便再从它的原型中寻找,依此类推,直到终点Object.prototype。

  • 原型关系是动态关系,如添加一新属性到原型中,基于原型创建的对象皆可见该属性

反射

  • 如检查对象有什么属性,去检索该属性并验证取得的值
  • typeof 确定属性类型
  • hasOwnProperty

枚举

  • for in 语句可遍历一个对象中的所有属性,该枚举过程会列出所有的属性(包括原型中的属性,so可过滤掉不需要的值) 常用过滤器hasOwnProperty
    var name;
    for(name in another_stooge){
        if(typeof another_stooge[name] !== 'function'){
        document.writeIn(name + ": " + another_stooge[name])
        }
    }

删除

  • delete 运算符可用来删除对象的属性
  • 如对象包含此属性,那么该属性会被移除,不会触及原型链
    another_stooge.nickname  // 'jason'
    // 删除 another 的 name 属性,从而暴露出原型的nickname 属性
    delete another_stooge.nickname;
    
    another_stooge.nickname  // 'Curly'

减少全局变量污染

  • 最小化使用全局变量-只创建一个唯一的全局变量
  • 把全局性资源纳入一个名称空间之下
    var myAPP = {}

    myApp.stooge = {
        name: 'Jason',
        ......
    }