6.JavaScript的对象

1.生成方法

对象是JavaScript的核心对象,也是最重要的数据类型。JavaScript的所有数据都可以被视为对象。

1.1简单的说,对象就是一种无序的数据集合,由若干的键值对构成。

var o={
        p:'hello word'
    };

上面的代码中,大括号定义了一个对象它被赋值给变量O,这个对象内部的包含一个键值对,p是'键名',hello word是值,键名与值之间用:连接,多个键值对之间用,连接,并且说有的键名都是字符串,所以加不加引号都是可以的,如果键名是数字,将会自动转化为字符串。

1.2生成对象的方法通常有三种,如下:

var o1={};
    var o2=new Object();
    var o3=Object.create(Object.prototype);

通常用第一种,后面两种,见识浅,没有见过,据说,高高高手才用。

1.3对象的每一个‘键名’又称为属性,他的键值可以是任何数据类型,如果一个属性的值为函数,通常把这个属性称为方法,它可以像函数一样的调用。

var o={
            p:123,
            m:function (a,b) {
                return a+b;
            }
        }
        o.p(1,3);

1.4对象的引用

如果不同的变量名指向同一个对象,那么他们的都是这个对象的引用,也就是说指向同一个内存地址,修改其中一个变量,会影响到其他的所有变量。

var p1={};
    var p2=p1;
    p1.a=1;
    p2.a //1
    
    p2.b=2;
    p1.b //2

上面的代码中,p1和p2指向同一个对象,因此其中任何一个变量添加属性,另一个变量可以读写该属性。
注:这一块的东西我也理解的不是很清楚,但是,归根结底就是一个变量的地址指向拷贝,和一个变量的值深度拷贝的问题,下面我会写一篇文章,将将解释清楚。

2.属性的操作

2.1属相的读取

属相的读取有下面的两种方法,如下:

var p={
        p:'zhanglei'
    };
    p.p  //zhanglei
    p['p']  //zhanglei

使用方括号这种形式,键名必须放到引号里面,不然会被当做变量处理,但是,数字键可以不加引号,应为会自动转换为字符串。

2.2属相的赋值

点和方括号的用算符不仅可以取值,可以赋值。

var p={
        p:'zhanglei'
    }
    
    p.p='xiaozhang';
    p['p']='xiaozhang';

2.3查看一个对象的所有属性

查看一个对象的所有属相,可以使用Object.keys方法。

var o={
        name:'zhanglei',
        age:25
    }
    Object.keys(0);  //['zhanglei',25]

2.4删除对象属性

用delete命令删除对象的属相,删除成功返回true。

var o = {p: 1};
Object.keys(o) // ["p"]

delete o.p // true
o.p // undefined
Object.keys(o) // []

2.5 in运算符

in运算符用于检查对象是否包含某一个属相,如果包含就返回true,要不返回false。

var p={
       p:1
   };
   
   'p' in p;  //true

in 运算符无法检测对象继承的属性。

2.6 for....in 循环

循环来遍历一个对象的全部属性。

var p={
        a:1,
        b:2,
        c:3
    }

    for(var i in p){
        console.log(p[i]);
    }

for---in遍历的是对象所有可遍历的属相,会跳过不可遍历的属相,并且它不仅遍历自身的属相,还遍历继承的属性。

// name 是 Person 本身的属性
function Person(name) {
  this.name = name;
}

// describe是Person.prototype的属性
Person.prototype.describe = function () {
  return 'Name: '+this.name;
};

var person = new Person('Jane');

// for...in循环会遍历实例自身的属性(name),
// 以及继承的属性(describe)
for (var key in person) {
  console.log(key);
}
// name
// describe

2.7with语句

用于操作一个属性的多个属性时,可以提供一些书写的便利。

// 例一
with (o) {
  p1 = 1;
  p2 = 2;
}
// 等同于
o.p1 = 1;
o.p2 = 2;

// 例二
with (document.links[0]){
  console.log(href);
  console.log(title);
  console.log(style);
}
// 等同于
console.log(document.links[0].href);
console.log(document.links[0].title);
console.log(document.links[0].style);

一般不常用,所以就不赘述了,就当没有这个玩意就可以了。