二十五岁时我们都一样愚蠢、多愁善感,喜欢故弄玄虚,可如果不那样的话,五十岁时也就不会如此明智。
标题:JavaScript对象定义
在JavaScript中,对象就是王。如果你了解的对象,你了解JavaScript。
在JavaScript中,几乎一切都是对象.
- Booleans 可以是对象 (如果定义使用new关键字)
- Numbers 可以是对象 (如果定义使用new关键字)
- Strings 可以是对象 (如果定义使用new关键字)
- 日期总是对象
- 数学(Math)总是对象
- 正则表达式总是对象
- 数组总是对象
- 函数总是对象
- 对象总是对象
除了原始值,所有JavaScript都是对象.
JavaScript 原始值
原始值是没有属性或方法的值.
原始数据类型是具有原始值的数据.
定义了5种基本数据类型:
- string
- number
- boolean
- null
- undefined
原始值是不变的(他们是硬编码的,因此不能改变).
如果x = 3.14,你可以改变x的值,但你不能改变值3.14。
值 类型 解释 "Hello" string "Hello" 总是 "Hello" 3.14 number 3.14 总是 3.14 true boolean true 总是 true false boolean false 总是 false null null (object) null 总是 null undefined undefined undefined 总是 undefined
对象是包含变量的变量
JavaScript变量可以包含单个值:
var person = "John Doe";对象也是变量。但对象可以包含许多值.
值被写成 name : value 键值对 (name 和 value 使用冒号分隔).
var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};JavaScript 对象是 named values 的集合
Object 属性
在JavaScript对象中的names和values, 被称为 属性.
属性 值 firstName John lastName Doe age 50 eyeColor blue 对象写成name value键值对就像:
- PHP 里面的关联数组
- Python 里面的字典
- C 里面的哈希表
- Java 里面的哈希Map
- Ruby 和 Perl 里面的哈希
对象方法
方法是可以在对象上执行的*操作.
对象属性既可以是原始值,也可以是其他对象和函数.
对象方法 是一个包含 函数定义 的对象属性.
属性 值 firstName John lastName Doe age 50 eyeColor blue fullName function() {return this.firstName + " " + this.lastName;} JavaScript对象name和value的容器,称为属性和方法。
你将在下一章学到更多关于方法的知识。
创建一个JavaScript对象
JavaScript,你可以定义和创建你自己的对象.
有不同的方法来创建新的对象:
- 使用对象字面量定义和创建单个对象
- 定义并创建一个对象,使用new关键字。
- 定义对象构造函数,然后创建构造类型的对象。
在ECMAScript 5里面, 也可以用Object.create()函数创建对象.
使用对象字面量
这是创建一个JavaScript对象的最简单的方法.
使用对象字面量,您可以在一个语句中定义和创建对象.
对象字面是一个包含在{}中的,name:value列表(如age:50)。
下面的示例创建一个新的JavaScript对象有四个属性:
var person = {firstName:"John", lastName:"Doe", age:50, eyeColor:"blue"};空格和换行不重要。对象定义可以跨越多行:
var person = { firstName:"John", lastName:"Doe", age:50, eyeColor:"blue" };
使用JavaScript关键字new
下面的示例创建了一个新的四个属性的JavaScript对象:
var person = new Object(); person.firstName = "John"; person.lastName = "Doe"; person.age = 50; person.eyeColor = "blue";上面的两个例子完全一样。. 这里需要使用 new Object(). 出于对简单性、可读性和执行速度考虑,请使用第一个(对象字面量方法).
使用对象构造函数
上面的例子在很多情况下都是有限的。它们只创建一个对象.
有时我们喜欢有一个“对象类型”,可以用来创建这个类型的许多对象.
创建“对象类型”的标准方法是使用对象构造函数:
function person(first, last, age, eye) { this.firstName = first; this.lastName = last; this.age = age; this.eyeColor = eye; } var myFather = new person("John", "Doe", 50, "blue"); var myMother = new person("Sally", "Rally", 48, "green");上述function (person)是对象构造函数
一旦拥有对象构造函数,就可以创建相同类型的新对象:
var myFather = new person("John", "Doe", 50, "blue"); var myMother = new person("Sally", "Rally", 48, "green");
this 关键字
在JavaScript中,所谓 this ,是对象,“自己的”的JavaScript代码。
this , 在函数中使用时,是“拥有”函数的对象。
this, 在对象中使用时,对象本身。
this 对象构造函数中的关键字不具有值。它只是新对象的替代品。
this 将成为新对象,当构造函数用于创建对象时。
注意 this 不是变量。这是一个关键词。你不能改变 this 的值.
内置的JavaScript构造函数
JavaScript有内置的本地对象的构造函数:
var x1 = new Object(); // A new Object object var x2 = new String(); // A new String object var x3 = new Number(); // A new Number object var x4 = new Boolean(); // A new Boolean object var x5 = new Array(); // A new Array object var x6 = new RegExp(); // A new RegExp object var x7 = new Function(); // A new Function object var x8 = new Date(); // A new Date objectMath() 对象不在列表中. Math是全局对象. new 关键字不能用于 Math.
你知道吗?
你可以看到,JavaScript具有原始数据类型对象的版本 String, Number, and Boolean.
没有理由创建复杂对象。原始值执行速度更快.
没有理由去使用 new Array(). 使用数组字面量代替: []
没有理由去使用 new RegExp(). 使用模式字面量代替: /()/
没有理由去使用 new Function(). 使用函数表达式代替: function () {}.
没有理由去使用 new Object(). 使用对象字面量代替: {}
var x1 = {}; // new object var x2 = ""; // new primitive string var x3 = 0; // new primitive number var x4 = false; // new primitive boolean var x5 = []; // new array object var x6 = /()/ // new regexp object var x7 = function(){}; // new function object
字符串对象
通常,字符串是作为基本类型创建的: var firstName = "John"
但字符串也可以创建为对象使用 new 关键字: var firstName = new String("John")
了解为什么字符串不应该被创建为对象请参考 JS 字符串.
布尔对象
通常情况下,布尔使用基本类型创建: var x = false
但布尔值也可以作为对象使用 new 关键字: var x = new Boolean(false)
了解为什么布尔值不应作为对象创建,请参考: JS 布尔.
JavaScript的对象是可变的
对象是可变的:他们的地址是一个引用类型,而不是值.
如果person是一个对象,下面的语句将不会创建person的副本:
var x = person; // This will not create a copy of 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注:JavaScript变量是不可变的。只有JavaScript对象是可变的。