JavaScript - ES5 对象方法

你好,未来的JavaScript法师们!今天,我们将深入ES5对象方法的神奇世界。如果你是编程新手,不用担心——我将成为你这次冒险的友好向导,我们会一步一个脚印地前进。在本教程结束时,你将能够像专业人士一样操作对象!

JavaScript - ES5 Object Methods

JavaScript ES5 对象方法

在我们开始之前,让我们快速回顾一下JavaScript中的对象是什么。可以把对象想象成一个包含相关信息的容器。例如,一个“汽车”对象可能包含颜色、品牌和年份等属性。

let car = {
color: "红色",
brand: "丰田",
year: 2020
};

现在,ES5引入了几个强大的方法来处理这些对象。让我们一个一个地探索它们!

JavaScript Object.create() 方法

Object.create() 方法允许我们使用现有的对象作为原型来创建一个新对象。就像说,“嘿,JavaScript,为我创建一个继承自这个其他对象的新对象!”

let animal = {
makeSound: function() {
console.log("某种通用动物声音");
}
};

let dog = Object.create(animal);
dog.makeSound(); // 输出: 某种通用动物声音

dog.bark = function() {
console.log("汪汪汪!");
};

dog.bark(); // 输出: 汪汪汪!

在这个例子中,我们创建了一个继承自 animal 对象的 dog 对象。dog 可以使用 animalmakeSound 方法,但它也有自己的 bark 方法。

JavaScript Object.defineProperty() 方法

Object.defineProperty() 允许我们添加或修改对象的属性。就像在购买汽车后能够为它添加新功能!

let person = {};

Object.defineProperty(person, "name", {
value: "John",
writable: false,
enumerable: true,
configurable: true
});

console.log(person.name); // 输出: John
person.name = "Jane"; // 这不会改变名字
console.log(person.name); // 输出: John

在这里,我们为 person 对象添加了一个 name 属性。我们将其设置为不可写,这意味着在设置后无法更改其值。

JavaScript Object.defineProperties() 方法

Object.defineProperties() 类似于 defineProperty(),但更加强大!它允许我们一次性定义多个属性。

let book = {};

Object.defineProperties(book, {
title: {
value: "了不起的盖茨比",
writable: true
},
author: {
value: "F. 斯科特·菲茨杰拉德",
writable: false
}
});

console.log(book.title); // 输出: 了不起的盖茨比
console.log(book.author); // 输出: F. 斯科特·菲茨杰拉德

book.title = "盖茨比"; // 这有效
book.author = "斯科特"; // 这无效

console.log(book.title); // 输出: 盖茨比
console.log(book.author); // 输出: F. 斯科特·菲茨杰拉德

在这个例子中,我们一次性为我们的 book 对象定义了两个属性。title 是可写的,但 author 不是。

JavaScript Object.getOwnPropertyDescriptor() 方法

此方法允许我们获取属性的描述。就像询问汽车特定功能的规格。

let car = {
brand: "丰田"
};

let descriptor = Object.getOwnPropertyDescriptor(car, "brand");

console.log(descriptor);
// 输出:
// {
//   value: "丰田",
//   writable: true,
//   enumerable: true,
//   configurable: true
// }

在这里,我们获取了我们 car 对象的 brand 属性的描述符。它告诉我们值以及属性是否可写、可枚举和可配置。

JavaScript Object.getOwnPropertyNames() 方法

此方法返回直接在给定对象中找到的所有属性(可枚举或不可枚举)的数组。就像获取你汽车的所有功能列表,包括隐藏的!

let person = {
name: "John",
age: 30
};

Object.defineProperty(person, "ssn", {
value: "123-45-6789",
enumerable: false
});

console.log(Object.getOwnPropertyNames(person));
// 输出: ["name", "age", "ssn"]

尽管我们将 ssn 设置为不可枚举,getOwnPropertyNames() 仍然将其包含在列表中。

JavaScript Object.getPrototypeOf() 方法

此方法返回指定对象的原型。就像问,“你的父母是谁?”

let animal = {
eats: true
};

let rabbit = Object.create(animal);

console.log(Object.getPrototypeOf(rabbit) === animal); // 输出: true

在这里,我们确认 rabbit 的原型确实是 animal 对象。

JavaScript Object.keys() 方法

Object.keys() 返回一个包含给定对象自身可枚举属性名称的数组。就像获取你汽车所有可见功能的列表。

let car = {
brand: "丰田",
model: "卡罗拉",
year: 2020
};

console.log(Object.keys(car));
// 输出: ["brand", "model", "year"]

此方法只返回可枚举属性,与 getOwnPropertyNames() 不同,后者返回所有属性。

JavaScript Object.freeze() 方法

Object.freeze() 冻结一个对象。冻结后的对象无法再被更改。就像把你的汽车放在冰块里——你不能添加、删除或修改它的属性!

let car = {
brand: "丰田",
model: "卡罗拉"
};

Object.freeze(car);

car.year = 2020; // 这不会工作
car.brand = "本田"; // 这也不会工作

console.log(car); // 输出: { brand: "丰田", model: "卡罗拉" }

在冻结 car 对象后,我们无法添加 year 属性或更改 brand

JavaScript Object.seal() 方法

Object.seal() 密封一个对象,防止新属性被添加,并将所有现有属性标记为不可配置。就像密封你的汽车——你不能添加新功能,但可以修改现有的。

let person = {
name: "John",
age: 30
};

Object.seal(person);

person.gender = "男性"; // 这不会工作
person.age = 31; // 这有效

delete person.name; // 这不会工作

console.log(person); // 输出: { name: "John", age: 31 }

我们可以更改 age,但不能添加 gender 或删除 name

JavaScript Object.isFrozen() 方法

此方法确定对象是否被冻结。就像检查你的汽车是否真的被困在冰块里!

let car = {
brand: "丰田"
};

console.log(Object.isFrozen(car)); // 输出: false

Object.freeze(car);

console.log(Object.isFrozen(car)); // 输出: true

JavaScript Object.isSealed() 方法

类似于 isFrozen(),此方法检查对象是否被密封。

let person = {
name: "John"
};

console.log(Object.isSealed(person)); // 输出: false

Object.seal(person);

console.log(Object.isSealed(person)); // 输出: true

JavaScript Object.preventExtensions() 方法

此方法防止新属性被添加到对象。就像在汽车上放置一个“不再添加功能”的标志。

let car = {
brand: "丰田"
};

Object.preventExtensions(car);

car.model = "卡罗拉"; // 这不会工作

console.log(car); // 输出: { brand: "丰田" }

在防止扩展后,我们无法添加 model 属性。

JavaScript Object.isExtensible() 方法

此方法确定对象是否可扩展(是否可以添加新属性)。

let car = {
brand: "丰田"
};

console.log(Object.isExtensible(car)); // 输出: true

Object.preventExtensions(car);

console.log(Object.isExtensible(car)); // 输出: false

以下是我们在本文中介绍的所有方法的总结:

方法 描述
Object.create() 创建一个具有指定原型对象和属性的新对象
Object.defineProperty() 将命名的属性和给定的描述符添加到对象中
Object.defineProperties() 直接在对象上定义新属性或修改现有属性,并返回该对象
Object.getOwnPropertyDescriptor() 返回对象的自有属性的属性描述符
Object.getOwnPropertyNames() 返回直接在给定对象中找到的所有属性的数组
Object.getPrototypeOf() 返回指定对象的原型
Object.keys() 返回一个包含给定对象自身可枚举属性名称的数组
Object.freeze() 冻结一个对象:其他代码不能删除或更改其属性
Object.seal() 密封一个对象,防止新属性被添加并将所有现有属性标记为不可配置
Object.isFrozen() 确定对象是否被冻结
Object.isSealed() 确定对象是否被密封
Object.preventExtensions() 防止新属性被添加到对象
Object.isExtensible() 确定对象是否可扩展

就是这样!你已经对ES5对象方法进行了精彩的巡游。记住,熟能生巧,所以不要犹豫,在你的代码中尝试这些方法。祝编程愉快,未来的JavaScript大师们!

Credits: Image by storyset