Javascript语言精粹 第三章学习笔记

176 阅读3分钟

1.对象字面量

  • 一个对象字面量就是包围在一对花括号中的零或多个“名/值”(key/value)
var a={};
  • 属性名如果是非法的javascript标识符或保留字,需要为其加上引号
 var person = {
        age: 18,
        nation: "hanzu",
        "xing ming": "hanjinglong",   //若属性名是非法字符串或保留字时,必须用引号括住
        "first-name": "dasima",       
        family: {                     //对象是可嵌套的
            mother: "xxx",
            father: "yyy"
        }
    };

(每个名/值要用逗号隔开,最后一个名/值不用)

2.检索

1.检索方式

  • 在[]后缀中括住一个字符串表达的方式
    person[age]  // 18
    person[family[mother]]  // xxx
  • 如果字符串是合法的javascript标识符且并非保留字,也可以用.表示法代替。而且优先考虑使用该方法,因为它更紧凑且可读性好。
    person.family.mother  //xxx

2.默认值与运算符

  • 当你尝试检索一个不存在的成员元素的值时,将返回一个undefined值。
        person.ma                    //undefined
        person.horse                 //undefined
        person.family.horse          //undefined
  • ||或运算符可以用来填充默认值
       var horse = person.horse || "(none)"         //undefined
       var king = person[king] || "unknown"         //undefined
  • 检索undefined值会导致TypeError异常。这可以通过&&并运算符来避免错误。
        person.ma            //undefined
        person.ma.name      //throw"TypeError"
        person.ma && person.ma.name  //undefined

3.更新

  • 对象中的值可以通过赋值语句来更新。

3.1 如果属性名已经存在对象中,则属性值被替换

3.2 如果对象中没有该属性名,则对象扩充该属性

       person.family.mother = "zzz";  //属性名mother的值被更新为zzz
       person.ma = "king";           //新增属性名ma 属性值为king

4.引用

对象通过引用来传递,对象的引用为地址引用

var x = stooge;
x.nickname = 'Curly'
var nick = stooge.nickname
//nick为Curly
var a = {},b = {},c = {};
//a、b、c每个都引用不同的空对象
a = b = c = {};
//a、b、c都引用同一个空对象

5.原型

1、所有通过对象字面量创建的对象都连接到Object.prototype这个JS中标准的对象。

2、创建一个新对象时,可以选择某个对象作为它的原型。通过构建Object的beget方法创建一个使用原对象作为其原型的新对象。

if( typeof Object.beget !== 'function' ){ 
    Object.beget = function(o){ 
          var F =new Function(o) {}; //定义构造函数F
          F.prototype = o;           //将传入对象设置为F的原型
          return new F();            //返回新实例
    }
}

Object.beget方法是将内容保存到原型链中,有利于后续的继承。并且更具有灵活性。

3、当我们对某个对象做出改变时,不会触及到该对象的原型。

4、委托:原型连接只有在检索值的时候才会被用到。如果我们尝试去获取某个对象的某个属性值,且该对象没有此属性名,那么JS会试着从原型对象中获取属性值,依此类推,直到该过程到达终点Object.prototype。如果原型链中不存在,则结果为undefined。

5、原型关系是一种动态的关系。如果我们添加一个新的属性到原型中,该属性会立刻对所有基于该原型创建的对象可见。

6.反射

typeof操作符用来确定属性的类型。

typeof flight.number   //'number'
typeof flight.arrival  //'object'
typeof flight.manifest //'undefined'

并且原型链中的任何属性都会产生值。

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

hasOwn方法不会检查原型链。

flight.hasOwnProperty('constructor')   //false

7.枚举

for in可用来遍历一个对象中的所有属性名(包括原型链中的属性)。并且属性出现的顺序是不确定的。

创建一个数组并使用for语句可以避免发掘出原型链中的属性并能得到正确的顺序。

var i;
var properties = {
    'first-name',
    'middle-name',
    'last-name',
    'profession'
};
for (i=0;i < properties.length;i += 1){
    document.writeln(properties[i] + ':' + another_stooge(properties[i]))
}

8.删除

delet运算符可以删除对象的属性,如果对象包含该属性,则该属性会被删除。

delete不触及原型链。

9.减少全局污染变量

把全局性的资源都纳入同一个名称空间之下,可以显著减少全局污染,并提高可读性。

var MYAPP = {}
MYAPP.stooge = {
    'first-name': "Joe"
}

MYAPP.flight = {
    airline: "Oceanic"
}