js对象(1)

对象是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,因为已经删除的属性的引用依然存在。这种问题有可能导致内存泄露,所以在删除对象属性的时候,一定要删除的彻底。遍历所有的属性,并且都删除。