我们常说“面向对象的编程”,在JavaScript中,对象就是最重要的内容。
在老家常把谈恋爱说成“找对象”,那么这里的对象是一个人,在JavaScript中,几乎“所有事物”都是对象。
布尔是对象(如果用 new 关键词定义)
数字是对象(如果用 new 关键词定义)
字符串是对象(如果用 new 关键词定义)
Date永远都是对象
Math永远都是对象
正则表达式RegExp永远都是对象
数组Array永远都是对象
函数Function永远都是对象
对象Object永远都是对象
所有 JavaScript 值,除了原始值(number、string、boolean、undefined,null),都是对象。
原始数据类型指的是拥有原始值的数据。原始值没有属性或方法。
原始值是一成不变的,比如“school”这个字符串,3.14这个数字,它们的值是不变的。
一、对象是变量
常规的变量包含一个值,但是对象可以包含很多值。对象是有值的变量的集合。
这些值以名称:值键值对(名称和值以冒号分隔)的形式写入。
var person = { firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};
object对象中的变量名称被叫做“属性”。
对象属性可以是原始值、其他对象以及函数。
这里的函数就是对象的方法。是一个可以执行的动作。
对象的方法就是包含了函数声明的对象属性。
var person = { firstName:"John", lastName:"Doe", age:50, eyeColor:"blue", fullName:function(){ return this.firstName+" "+this.lastName; }};
二、创建一个对象
有不同的方法来创建对象:
定义和创建单个对象,使用对象字面量。
定义和创建单个对象,通过关键词 new。
定义对象构造函数,然后创建构造类型的对象。
在 ECMAScript 5 中,也可以通过函数 Object.create() 来创建对象。
1、使用对象字面量
这是创建对象最简单的方法。
var person = { firstName:"Bill", lastName:"Gates", age:62, eyeColor:"blue" };
2、使用new的方式创建
var person = new Object(); person.firstName = "Bill"; person.lastName = "Gates"; person.age = 50; person.eyeColor = "blue";
出于简易性、可读性和执行速度的考虑,使用对象字面量的方式更好。
三、对象是易变的
因为对象它们是通过引用来寻址,而非值。
不像原始数据类型,是值的传递。
所以,把对象赋值给另一个变量, 并不是创建了对象的副本,产生了新的对象,而是只是把对象的地址给了新的变量,它们都共同指向同一个对象。
var x = person; // 这不会创建 person 的副本。
对象 x 并非 person 的副本。它就是 person。x 和 person 是同一个对象。
对 x 的任何改变都将改变 person,因为 x 和 person 是相同的对象。
var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"} var x = person; x.age = 10; // This will change both x.age and person.age
具体内容可以查看一下这篇文章关于堆内存和栈内存的分析。
四、访问属性和方法
1、访问属性的两种方法
objectName.property objectName["property"]
在点语法中,property属性名称是一个有效的 JavaScript 标识符,例如,一串字母数字字符,也包括下划线及美元符号,但不能以数字作为开头。比如,object.$1是合法的,而 object.1是无效不合法的。这就是为什么数组不能用点语法访问值的原因了。
在[ ]语法中,property是一个字符串。该字符串不一定是一个合法的标识符;它可以是任意值,例如,"1foo","!bar!",甚至是 " "(一个空格),也可以是一个传递过来的变量。
属性名称必须是字符串或符号 Symbol。这意味着非字符串对象不能用来作为一个对象属性的键。任何非字符串对象,包括 Number,都会通过 toString 方法,被转换成一个字符串。
var object = {}; object['1'] = 'value'; console.log(object[1]); //value
上述代码的输出为"value",因为 1 被类型转换为'1'。
var foo = {unique_prop: 1}, bar = {unique_prop: 2}, object = {}; object[foo] = 'value'; //被toString()转成了object["[object Object]"]="value" console.log(object[bar]); //value
上述的代码的输出也是 "value",由于对象 foo 和 bar 都会被转成相同的字符串。在SpiderMonkey JavaScript 引擎中,这个字符串是 "[object Object]"。
2、访问方法
只能通过点语法访问对象的方法。
objectName.methodName()
发表评论:
◎请发表你卖萌撒娇或一针见血的评论,严禁小广告。