复习笔记 JavaScript语言精粹 第3章 对象

89 阅读3分钟

对象

  • 简单数据类型
    • 数字
    • 字符串
    • 布尔值
    • null值
    • undefined
  • 其他都是对象
  • 数字和字符串有点像对象
    • 因为他们有方法
    • 但是他们的字是不可变的
  • 对象是可变的键控集合
  • 对象是属性的容器
    • 属性名可以是包括空字符串在内的任意字符串
    • 属性值是除undefined以外的任意值
  • 对象可以包含对象
    • 可以容易的表示树状或图形结构
  • 原型链特性
    • 允许对象继承另外一个对象的属性
  • 对象字面量
    • 包含在花括号里面的一或多个名/值对
  • 属性名如果不是保留字且合法的话,可以不用引号括上
  • 属性值可以是任意表达式
    var empty_object = {};
    var stooge = {
        'first-name':'Jerome',
        'last-name':'Howard'
    }
    var flight = {
        airline:'Oceanic',
        number:815,
7不     zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
            IATA:'SYD',
            time:'2004-09-22 14:55',
            city:'Sydeney'
        },
        arriveal{
        IATA:'LAX',
        time:'2004-09-23 10:42',
        city:'Los Angeles'
        }
    };

检索

  • 用[]或.点的话要求必须是合法的且不是保留字的属性名
  • 用&&或||填充默认值
  • 从undefined成员中获取值,会报错,可以通过&&来避免
console.log(stooge['first-name'],flight.departure.city)
var middle = stooge['middle-name'] || '(none)';
var status = flight.equipment && flight.equipment.model;

更新

  • 通过赋值语句更新,有的话就更新,没有的话就在最后面新建
tooge['first-name'] = 'ran';
tooge['middle-name'] = 'qi';

引用

  • 对象通过引用来传递,类似C#里面的引用类型
var x = stooge;
x.nickeName = 'Curly';
var nick = stooge.nickeName;
var a ={},b={},c={};
var a=b=c={};

原型

  • 每个对象都链接到一个原型对象,继承其属性.
  • 通过对象字面量创建的对象都链接到Object.prototype
  • 创建对象时可以自定义原型对象
Object.create = function(o){
  var F = function(){};
  F.prototype = o;
  return new F();
};
  var another_stooge = Object.create(stooge);
  console.log(another_stooge['first-name'],another_stooge['middle-name'],another_stooge['last-name'],another_stooge.nickeName);
  another_stooge.nickeName = 'ranwawa';
  console.log(stooge.nickeName);
  • 原型链接在更新时是不起作用的,对某个对象做出改变时,是不会触及该对象的原型的.这个引用是有区别的.如下:
var a = function(x){
  x.nickeName = "ranwawa";
};
a(stooge);
  • 原型链接只有在检索值的时候才会被乃,如果获取对象的某个属性,如果当前对象没有该属性,则去找他原型的属性直到找到Object.prototype为止..这个过程是委托
  • 原型关系是动态的关系.添加一个新的属性到原型中,这个属性会立即对所有基于该原型的对象可见
  stooge.profession = "actor";
  console.log(another_stooge.profession);

反射

  • 检查对象并确定对象有什么属性.typeof
  flight.status,typeof flight.arriveal,typeof flight.manifest);
  console.log(typeof flight.toString,typeof flight.constructor)
  • 通过类型判断function或者hasownproperty来检查原型链

枚举

  • for in会列举出所有属性,包含函数和原型中的属性
  • for in会出现函数和原型属性,并且属性出现顺序不确定.所以通常还是用for来遍历(先添加一个属性数组,再遍历数组即可),而不是for in
  var name;
  stooge.age = 222;
  for(name in another_stooge){
    if(typeof another_stooge[name] !== 'function' && another_stooge.hasOwnPropertyame)){
      console.log(name);
    };
  };

删除

 delete删除对象属性,不会触及原型中的任何对象,但是可以暴露原型链的属性
  console.log(stooge.nickeName,another_stooge.nickeName);
  delete another_stooge.nickeName;
  console.log(stooge.nickme,another_stooge.nickeName);

减少全局变量污染

  • 全局变量很不好,但是为什么不好就不知道了....
  • 解决办法是只创建一个全局变量,就像微信小程序那样
  var MYAPP = {}
  // 后面在要声明变量的时候,直接这样
  MYAPP.stooge = {
  xxx:xxx
}
  • 可以避免和其他插件的冲突,也可以在以后的使用中,更容易阅读..