对象
- 简单数据类型
- 数字
- 字符串
- 布尔值
- 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';
引用
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);
反射
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
}
- 可以避免和其他插件的冲突,也可以在以后的使用中,更容易阅读..