教程 > ES6 教程 > ES6 基础 阅读:30

ES6 对象

JavaScript 支持扩展数据类型。 JavaScript 对象是定义自定义数据类型的好方法。

对象是包含一组键值对的实例。 与原始数据类型不同,对象可以表示多个或复杂的值,并且可以在其生命周期内发生变化。 这些值可以是标量值或函数,甚至是其他对象的数组。

进一步讨论了定义对象的句法变体。

对象初始化

与原始类型一样,对象具有文字语法:**花括号 ({and})**。 以下是定义对象的语法。

var identifier = {
   Key1:value, Key2: function () { 
      //functions 
   }, 
   Key3: [“content1”,” content2”] 
} 

对象的内容称为属性(或成员),属性由名称(或键)和值组成。 属性名称必须是字符串或符号,值可以是任何类型(包括其他对象)。

与所有 JavaScript 变量一样,对象名称(可以是普通变量)和属性名称都区分大小写。 您可以使用简单的点表示法访问对象的属性。

以下是访问对象属性的语法。

objectName.propertyName 

示例:初始化对象

var person = { 
   firstname:"Tom", 
   lastname:"Hanks", 
   func:function(){return "Hello!!"},    
}; 
//access the object values 
console.log(person.firstname)   
console.log(person.lastname) 
console.log(person.func())

上面的例子,定义了一个对象person。 该对象具有三个属性。 第三个属性是指函数。

成功执行上述代码后会显示以下输出。

Tom 
Hanks 
Hello!!

在 ES6 中,分配与属性名称匹配的属性值时,可以省略属性值。

var foo = 'bar' 
var baz = { foo } 
console.log(baz.foo)

上面的代码片段定义了一个对象 baz。 该对象具有属性 foo。 这里省略了属性值,因为 ES6 将变量 foo 的值隐式分配给对象的键 foo。

以下是上述代码的 ES5 等价物。

var foo = 'bar' 
var baz = { foo:foo } 
console.log(baz.foo)

成功执行上述代码后会显示以下输出。

bar

使用这种简写语法,JS 引擎在包含范围内查找具有相同名称的变量。 如果找到,则将该变量的值分配给该属性。 如果未找到,则抛出引用错误。


Object() 构造函数

JavaScript 提供了一个名为 Object() 的特殊构造函数来构建对象。 new 运算符用于创建对象的实例。 要创建对象,new 运算符后跟构造函数方法。

以下是定义对象的语法。

var obj_name = new Object(); 
obj_name.property = value;    
// 或者             
obj_name["key"] = value 

以下是访问属性的语法。

Object_name.property_key                    
// 或者              
Object_name["property_key"]

示例

var myCar = new Object(); 
myCar.make = "Ford"; // 定义一个对象
myCar.model = "Mustang"; 
myCar.year = 1987;  

console.log(myCar["make"]) // 获取对象属性
console.log(myCar["model"]) 
console.log(myCar["year"])

成功执行上述代码后会显示以下输出。

Ford 
Mustang 
1987

对象的未分配属性是未定义的。

var myCar = new Object(); 
myCar.make = "Ford"; 
console.log(myCar["model"])

成功执行上述代码后会显示以下输出。

undefined

注意 - 对象属性名称可以是任何有效的 JavaScript 字符串,或任何可以转换为字符串的内容,包括空字符串。 但是,任何不是有效 JavaScript 标识符的属性名称(例如,具有空格或连字符的属性名称,或者以数字开头的属性名称)只能使用方括号表示法进行访问。

也可以使用存储在变量中的字符串值来访问属性。 换句话说,对象的属性键可以是一个动态值。 例如:变量。 上述概念在以下示例中说明。

var myCar = new Object()  
var propertyName = "make"; 
myCar[propertyName] = "Ford"; 
console.log(myCar.make)

成功执行上述代码后会显示以下输出。

Ford

构造函数

可以使用以下两个步骤创建一个对象 -

第 1 步 - 通过编写构造函数定义对象类型。

以下是相同的语法。

function function_name() { 
   this.property_name = value 
}

this”关键字引用当前使用的对象并定义对象的属性。

第 2 步 - 使用新语法创建对象的实例。

var Object_name= new function_name() 
// 访问属性值

Object_name.property_name

new 关键字调用函数构造函数并初始化函数的属性键。

示例

使用构造函数

function Car() { 
   this.make = "Ford" 
   this.model = "F123" 
}  
var obj = new Car() 
console.log(obj.make) 
console.log(obj.model)

上面的示例使用函数构造函数来定义对象。

成功执行上述代码后会显示以下输出。

Ford 
F123 

始终可以将新属性添加到先前定义的对象中。 例如,考虑以下代码片段

function Car() { 
   this.make = "Ford" 
} 
var obj = new Car() 
obj.model = "F123" 
console.log(obj.make) 
console.log(obj.model)

成功执行上述代码后会显示以下输出。

Ford 
F123

Object.create 方法

也可以使用 Object.create() 方法创建对象。 它允许我们为所需对象创建原型,而无需定义构造函数。

var roles = { 
   type: "Admin", // Default value of properties 
   displayType : function() {  
      // Method which will display type of role 
      console.log(this.type); 
   } 
}  
// Create new role type called super_role 
var super_role = Object.create(roles); 
super_role.displayType(); // Output:Admin  

// Create new role type called Guest 
var guest_role = Object.create(roles); 
guest_role.type = "Guest"; 
guest_role.displayType(); // Output:Guest

上面的示例定义了一个对象角色并设置了属性的默认值。 创建了两个新实例,它们覆盖了对象的默认属性值。

成功执行上述代码后会显示以下输出。

Admin 
Guest

Object.assign() 方法

Object.assign() 方法用于将所有可枚举的自身属性的值从一个或多个源对象复制到目标对象。 它将返回目标对象。

以下是相同的语法。

Object.assign(target, ...sources) 

示例

克隆对象

"use strict" 
var det = { name:"Tom", ID:"E1001" }; 
var copy = Object.assign({}, det); 
console.log(copy);  
for (let val in copy) { 
   console.log(copy[val]) 
}

成功执行上述代码后会显示以下输出。

Tom 
E1001

合并对象

var o1 = { a: 10 }; 
var o2 = { b: 20 }; 
var o3 = { c: 30 }; 
var obj = Object.assign(o1, o2, o3); 
console.log(obj);  
console.log(o1);

成功执行上述代码后会显示以下输出。

{ a: 10, b: 20, c: 30 } 
{ a: 10, b: 20, c: 30 }

注意 - 与复制对象不同,合并对象时,较大的对象不会维护属性的新副本。 相反,它持有对原始对象中包含的属性的引用。 下面的例子解释了这个概念。

var o1 = { a: 10 }; 
var obj = Object.assign(o1); 
obj.a++ 
console.log("Value of 'a' in the Merged object after increment  ") 
console.log(obj.a);  
console.log("value of 'a' in the Original Object after increment ") 
console.log(o1.a);

成功执行上述代码后会显示以下输出。

Value of 'a' in the Merged object after increment 
11  
value of 'a' in the Original Object after increment 
11 

删除属性

我们可以使用删除运算符删除属性。 以下代码显示如何删除属性。

// 创建一个新对象 myobj,它具有两个属性 a 和 b。
var myobj = new Object; 
myobj.a = 5; 
myobj.b = 12; 

// Removes the ‘a’ property 
delete myobj.a; 
console.log ("a" in myobj) // yields "false"

成功执行上述代码后会显示以下输出。

false

代码片段从对象中删除属性。 该示例打印 false,因为 in 运算符未在对象中找到该属性。


比较对象

在 JavaScript 中,对象是一种引用类型。 两个不同的对象永远不会相等,即使它们具有相同的属性。 这是因为,它们指向一个完全不同的内存地址。 只有那些共享公共引用的对象才会在比较时产生 true

示例

不同的对象引用

var val1 = {name: "Tom"}; 
var val2 = {name: "Tom"}; 
console.log(val1 == val2)  // return false 
console.log(val1 === val2)  // return false

在上面的示例中,val1 和 val2 是两个不同的对象,它们引用两个不同的内存地址。 因此,在比较相等性时,运算符将返回 false。

单个对象引用

var val1 = {name: "Tom"}; 
var val2 = val1  

console.log(val1 == val2) // return true 
console.log(val1 === val2) // return true

在上面的例子中,val1 中的内容被赋值给了 val2,即 val1 中的属性的引用与 val2 共享。 由于对象现在共享对属性的引用,因此相等运算符将为引用两个不同内存地址的两个不同对象返回 true。 因此,在比较相等性时,运算符将返回 false。


对象解构

术语解构是指分解实体的结构。 JavaScript 中的解构赋值语法可以将数据从数组或对象中提取到不同的变量中。 下面的例子说明了这一点。

示例 1

解构对象时,变量名称和对象属性名称必须匹配。

let student = {
   rollno:20,
   name:'Prijin',
   cgpa:7.2
}

// 解构为相同的属性名称
let {name,cgpa} = student
console.log(name)
console.log(cgpa)

// 解构为不同的名字
let {name:student_name,cgpa:student_cgpa}=student
console.log(student_cgpa)
console.log("student_name",student_name)

上面代码的输出如下所示 -

Prijin
7.2
7.2
student_name Prijin

示例 2

如果变量和赋值在两个不同的步骤中,那么解构对象语法将被 () 包围,如示例所示 ({rollno} = student)

let student = {
    rollno:20,
    name:'Prijin',
    cgpa:7.2
}

// destructuring to already declared variable
let rollno;
({rollno} = student)
console.log(rollno)

// assign default values to variables

let product ={ id:1001,price:2000} // discount is not product property
let {id,price,discount=.10} = product
console.log(id)
console.log(price)
console.log(discount)

上面代码的输出如下所示

20
1001
2000
0.1

示例3

下面的示例显示了使用 rest 运算符进行解构以及如何解构嵌套对象。

// rest operator with object destructuring
let customers= {
    c1:101,
    c2:102,
    c3:103
}

let {c1,...others} = customers
console.log(c1)
console.log(others)

//nested objects
let emp = {
    id:101,
    address:{
         city:'Mumbai',
         pin:1234
    }
}
let {address} = emp;

console.log(address)
let {address:{city,pin}} = emp
console.log(city)

上面代码的输出如下所示

101
{c2: 102, c3: 103}
{city: "Mumbai", pin: 1234}
Mumbai

查看笔记

扫码一下
查看教程更方便