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.14number3.14 总是 3.14
truebooleantrue 总是 true
falsebooleanfalse 总是 false
nullnull (object)null 总是 null
undefinedundefinedundefined 总是 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 object

让我试试

Math() 对象不在列表中. 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对象是可变的。