我的Javascript语言精粹-对象篇

Javascript是一门 面向对象的语言。在Javascript中,除 数字字符串布尔值nullundefined 之外,其他的值全部为对象。

对象


对象,可以理解为一种数据集合,类似于Java中的Map,由 key-value 方式构成。所以我们不难理解为什么Javascript的基本数据结构中没有Map,因为在大多数使用Map的场景都可以使用对象处理。

对象字面量

最常规的创建对象的方法,是使用 对象字面量 来进行创建。即,用花括号包围的 key-value 来进行对象的定义。

var foo = {
    "name" : "tongyao",
    "sex" : "male",
    "job" : "programmer"
};

JavaScript中自定义的对象(用户定义的本地对象)任何时候都是可变的。内置本地对象的属性也是可变的。你也可以先创建一个空对象,然后在需要时给它添加功能。

对象的属性名可以加引号或者不加引号。但如果属性名本身并非合法的标示符名,则需要添加引号。

对象的引用

Javascript中,对于对象的传递为 引用传递。也就是说,不同变量名指向同一个对象,实际指向了相同的内存地址,对其中任何一个对象的修改,都会引起其他对象引用的改变。

var foo = {};
var bar = foo;
foo.name = "Tom";
console.log(bar.name);// Tom

需要特别说明的是,与对象相对应的是,原始类型的传递采用 值复制 的方式。

对象属性


读取/写入属性

对象的属性,可以通过 .运算符或者 [] 运算符来进行读取。

这两种方法都可以使用,一般来说使用 . 运算符更加直观。如 var myName = student1.name;。但如果属性的值,是通过变量名进行传递的,则只有在[] 运算符中才可以获得正确的动态值。

function readProperty(propName) {
    console.log(foo[propName]);// Tom
    console.log(foo.propName);// undefined
}

readProperty(name);

对属性的赋值也是如此,使用以上两种运算符:

var foo = {};
foo.name = "tom";
foo["sex"] = "male";

遍历属性(枚举)

对对象使用 for-in 循环,可以遍历对象的所有属性,也包括从 原型链上继承 的的属性。

如果不想包含从原型链上继承的的属性,需要使用 hasOwnProperty 方法。

如果希望过滤函数,可以使用 typeof 运算符。

删除属性

使用 delete 运算符可以删除对象的属性,如:

delete foo.name;

delete 运算符不会删除原型链中的属性。如果对象中的属性覆盖了原型链中的属性,删除对象属性后,使用原型链的属性。

Object对象


在Javascript中,有一个 Object 对象,其他所有对象都继承自此对象。

创建对象的思考