对象是JavaScript的基本数据类型,是复合值,在JavaScript中除了字符串、数字、true、false、null和undefined之外,JavaScript中的值都是对象。
创建JavaScript对象
使用对象直接量,也就是名值对组成的映射表,格式如下:
var empty = {}; //这是一个空对象
var point = { x:0 , y:1 }; //这个对象有连个属性
var car = {
name:'BMW X7',
color:'black',
'max-speed':'200' //属性名中间有空格或-,必须用字符串表示
}
使用new
创建对象:
var myArray = new Array(); //创建一个数组,等同于[]
var date = new Date() //创建一个Date对象
原型
绝大多数JavaScript对象都会和另一个对象关联,这种关联就涉及到了原型,当通过关键字new和构造函数创建对象的时候,实际上是构造该对象的prototype属性,JavaScript对象具有自有属性,也有一些属性是从原型对象继承而来的,所以通过new Array()
创建的对象的原型就是Array.prototype。
举个例子,当我们要查询对象ooo中的x属性,如果o中不存在x,那么会在o的原型中继续查找x。如果原型对象中也没有x,那么会在这个原型对象的原型上继续查询,知道找到这个x,或者直到某个对象的原型是null
为止,这样我们可以清楚的发现,对象的原型属性构成了一个链,通过这个链,就可以实现属性的继承(图片来源)。
ECMAScript5中定义了一个Object.creat()的方法,创建一个新的对象,其中的一个参数就是对象的原型,同时还有第二个参数,是对对象的属性的进一步描述。
var o = Object.creat({x:1,y:1}); //o继承了属性x和y
如果我们传入了null参数,这时创建的对象就不会继承任何东西(基础方法也不会继承),比如toString(),如果想要创建一个新对象需要传入Object.prototype。下面这个方法可以模拟原型继承:
function inherit(p){
if(p==null) throw TypeError();
if(Object.creat)
return Object.creat(p);
var t = typeof p;
if(t !== "object" && t !== "function") throw TypeError();
function f() {};
f.prototype = p;
return new f();
}
对象属性的查询和设置
对象的属性可以通过’.
‘或者’[]
‘进行查询,简单的说,当使用’.
‘的时候,’.
‘的右边一定要是对象的属性名,当使用’[]
‘的时候,’[]
‘内必须是一个计算结果为字符串的表达式,也可以直接是字符串。同时我们也可以使用’.
‘和’[]
‘来设置属性值。
var book={
name:'AngularJs'
title:'Easy Study'
}
console.log(book.name); //AngularJs
console.log(book[name]); //AngularJs
book.color = 'red';
book.pages = 1000;
console.log(book.color); //red
console.log(book[pages]); //1000
值得注意的是,在我们的程序中可能经常会出现这样的代码,
var length = book.subtitle.length; //这会抛出一个错误,因为book.subtitle本身是undefined的,并没有length属性,除非你确定subtitle和book都是对象,否则尽量不要这样去写。可以用下面的两种方式。
//方法一
var length = undefined;
if(book){
if(book.subtitle) len = book.subtitle.length;
}
//方法二:短路写法
var length = book && book.subtitle && book.subtitle.length;
对象属性的删除
删除属性可以用delete运算符,但是delete只能断开属性和宿主对象的关系,而不会去操作属性中的属性,说白了,就是当一个对象的属性的值的类型还是一个对象的时候,当我们删除了这个属性,这个作为属性的这个对象依然可以使用的。
a = {p:{x:1}};
b = a.p;
delete a.p;
console.log(b.x);
//输出1,因为已经删除的属性的引用依然存在。这种问题有可能导致内存泄露,所以在删除对象属性的时候,一定要删除的彻底。遍历所有的属性,并且都删除。