JavaScript语言精粹:对象——读书笔记

184 阅读2分钟

1 对象

简单数据类型

  • number
  • string
  • boolean
  • null
  • undefined

对象类型

  • array
  • function
  • regularExpression
  • object

对象简介

  • 可变的键控集合,属性的容器,无类型
  • 属性:任意字符串(包括空字符串)
  • 属性值:非undefined

1.1 对象字面量

var empty_object = {};
var stooge = {
    "first-name":"Jerome";
    "last-name":"Howard"
};
var flight = {
    airline:"Oceanic",
    number:815,
    departure:{
        IATA:"SYD",
        time:"2004-09-22 14:55",
        city:"Sydney"
    },
    arrival:{
        IATA:"LAX",
        time:"2004-09-23 10:42",
        city:"Los Angeles"
    }
};

1.2 检索

stooge["first-name"]    //"Jerome"
flight.departure.IATA   //"SYD"

1.2.1 检索一个并不存在的成员属性,返回undefined

stooge["middle-name"]   //underfined

1.2.2 || 填充默认值

var middle = stooge["middle-name"] || 'none'  //middle='none'

1.2.3 && undefined的成员属性取值

stooge["middle-name"]                                   //undefined
stooge["middle-name"].model                             //throw typeError
stooge['middle-name'] && stooge['middle-name'].model    //undefined

1.3 更新

stooge["middle-name"] = 'Ning'        //扩充
stooge["first-name"] = "Zhang"        //覆盖

1.4 引用

var x = stooge;
x.nickName = 'Curly';
var nick = stooge.nickName;         //x,stooge指向同一个对象 'Curly'

var a = {}, b = {}, c = {};         //a,b,c分别指向3个不同的空对象
a = b = c = {};                     //a,b,c指向同一个空对象

1.5 原型

  • 每个对象都连接到一个原型对象,并可以从中继承属性。
  • 通过对象字面量创建的对象连接到Object.prototype,它是JavaScript的标配对象。
  • 当你创建一个新对象时,可以选择某个对象作为它的原型。
Object.myCreate = function (obj) {
    var F = function () { };
    F.prototype = obj;
    return new F();
}
var another_stooge = Object.myCreate(stooge);
  • 原型连接只有在检索时使用,若获取某对象属性值,但该对象没有该属性,JavaScript会尝试从该对象的原型对象上获取此属性值,以此类推,直到Object.prototype。如果想要的属性完全不存在于原型链中,返回undefined。这个过程称为委托
  • 原型关系是一种动态关系。如果添加一个属性到原型中,该属性立即对所有基于该原型的创建对象都可见。
stooge.profession = 'actor';
another_stooge.profession   //'actor'

1.6 反射

typeof flight.number    //number
typeof flight.status    //string
typeof flight.arrival   //object
typeof flight.mainfest  //undefined

原型链任何属性都能产生值。

typeof flight.toString  //function
typeof flight.constructor   //function

hasOwnProperty不会检查原型链

flight.hasOwnProperty('number') //true
flight.hasOwnProperty('constructor')   //false

1.7 枚举

for in 列出所有属性包括函数和原型链上的属性。

var name;
for(name in another_stooge){
    if(typeof another_stooge[name]!=='function'){   //排除函数
        console.log(name,another_stooge[name]);
    }
}

for in中遍历的属性名顺序不确定。使用for代替。

var i;
var properties=[
'first-name',
'middle-name',
'last-name',
'profession'];
for(i=0;i<properties;i++){
    console.log(properties[i],another_stooge[properties[i]]);
}

1.8 删除

删除不会触及原型链上的对象。

another_stooge.nickname     //'Moe'
delete another_stooge.nickname  //删除nickname,使原型链上的属性暴露
another_stooge.nickname     //'Curly',stooge的。

1.9 减少全局变量污染

全局变量削减了程序的灵活性,应避免使用。 最小化使用全局变量:只创建唯一的全局变量。

var MYAPP = {};

把全局性的资源都纳入一个名称空间之下,不同组件间冲突的可能性会明显降低。