基本类型和对象
基本类型包括数字,字符串,true/false,null,undefined,其余都是对象。对象是属性的容器,每个属性都有名字和值,属性名是任意字符串,值是除undefined以外任何值。javascript对象是无类型的(class-free),对象用于汇集和管理数据。 注:数字,字符串,布尔值有方法,但他们是基本类型,他们是不可变的。对象是可变的键控集合。
对象字面量
对象字面量提供了一种创建对象的方式,和Java等语言的基于Class的面向对象不同,JavaScript更倾向于直接使用基于实例的对象,例子:
var student = {
"name" : "Tom",
"age" : 18
};
对象是可以嵌套的,例子:
var student = {
"name" : "Tom",
"age" : 18
};
var teacher = {
"name" : "Bob",
"student" : student
};
读取对象的值,使用中括号"[]"或点"."运算符,优先考虑点运算符,可读性更好。例子:
console.log(student["name"]);
console.log(student.name);
如果尝试访问不存在的属性,结果是undefined。尝试从undefined中取值,会得到typeError异常。
更新属性
直接对属性赋值就可以更新属性,对不存在的属性赋值,可以扩充属性。
var student = {
"name" : "Tom",
"age" : 18
};
student.name = "Alice";
student.hobby = "computer";
引用
对象通过引用传递。
原型(Prototype)
每个对象都连接到一个原型对象,继承其属性,通过对象字面量创建的对象都连接到Object.prototype,可以通过向Object添加一个工厂方法,实现原型链的继承。例子:
if(typeof Object.create != "function")
{
Object.create = function(o)
{
var F = function() {};
F.prototype = o;
return new F;
}
}
var student = {
"age" : 18
};
var tom = Object.create(student);
tom.name = "tom";
console.log(tom.name);
console.log(tom.age);
注:《Javascript语言精粹》书上这段代码好像写错了
原型连接在属性更新时是不起作用的,也就是说改变某个对象的属性不会触及该对象的原型。
原型链的委托
当我们查找一个对象的属性时,先在这个对象的键中查找,如果没找到,按照原型链向上查找,直到Object.prototype,如果还未找到,就返回undefined。这被成为委托。
这种委托是动态的,在一个对象的原型中添加一个新属性,在这个对象中也可以检索到这个属性。
针对上文“原型链在更新时不起作用”,因为在当前对象中更新这个属性,相当于对当前对象添加一个同名的属性,检索这个属性的时候,直接在当前对象中找到了这个属性,因此就不会按照原型链向上查找了,表现就像该对象的属性更新了,原型却未被影响,如果原型的属性更新了,而该对象中没有这个属性,该对象会立即受到影响。例子:
var tom = Object.create(student);
tom.name = "tom";
student.age = 19;
console.log(tom.name);
console.log(tom.age);
属性检索
检索对象的属性,可以通过typeof的结果进行辅助。hasOwnProperty方法只检索当期对象,不检索原型链。
遍历对象属性值
for in语句可以遍历属性值,默认会检索到prototype中的属性,可以配合hasOwnProperty使用,对象中属性的出现顺序是不确定的。
删除属性
delete运算符可以删除对象的属性,如果对象包含这个属性这个属性就会被移除,它不会触及原型链中的对象,注意删除对象的属性可能会让原型链中同名的变量暴露出来。
减小全局变量污染
全局变量应该尽量少的使用,避免其互相影响,最佳实践是只创建一个对象,其中存放用到的全局变量。
var myapp = {};
myapp.global_var_1 = {
...
};
myapp.global_var_2 = {
...
};