在JavaScript中,对象是最重要的数据类型,构成了现代JavaScript的构建块。这些对象与JavaScript的基本数据类型(数字、字符串、布尔值、null、未定义和符号)有很大不同,因为这些基本数据类型都存储一个值(取决于它们的类型)。
- 对象更复杂,每个对象可能包含这些基本数据类型以及引用数据类型的任意组合。
- 对象是一种引用数据类型。分配了参考值的变量会被指定一个参考或指向该值的指针。该引用或指针指向内存中存储对象的位置。这些变量实际上并不存储值。
- 粗略地说, JavaScript中的对象可以定义为相关数据的无序集合,基本类型或引用类型,以“键:值”对的形式。 这些键可以是变量或函数,在对象上下文中分别称为属性和方法。
可以使用带有可选属性列表的图括号{…}创建对象。属性是“key:value”对,其中key是字符串(也称为“属性名”),而value可以是任何内容。 为了理解这个相当抽象的定义,让我们来看一个JavaScript对象的例子:
let school = { name : "Vivekananda School", location : "Delhi", established : "1971" }
在上面的例子中 “名称”、“位置”、“已建立” 都是 “钥匙” 和 “维韦卡南达学校”、“德里”和1971年 分别是这些键的值。
每把钥匙都被称为 属性 物体的形状。JavaScript中的对象也可以有一个作为成员的函数,在这种情况下,它将被称为 方法 那个物体的形状。
让我们看看这样一个例子:
// javascript code demonstrating a simple object let school = { name: 'Vivekananda School' , location : 'Delhi' , established : '1971' , displayInfo : function (){ console.log(`${school.name} was established in ${school.established} at ${school.location}`); } } school.displayInfo(); |
输出:
在上面的例子中, “显示信息” 是学校对象的一种方法,用于处理存储在其属性中的对象数据。
JavaScript对象的属性
属性名称可以是字符串或数字。如果属性名称是数字,则必须使用以下“括号符号”访问它们:
let school = { name: 'Vivekananda School' , location : 'Delhi' , established : '1971' , 20 : 1000, displayInfo : function (){ console.log(`The value of the key 20 is ${school[ '20' ]}`); } } school.displayInfo(); |
输出:
但稍后将详细介绍括号符号。
属性名也可以是包含多个空格分隔的单词的字符串。在这种情况下,这些属性名称必须用引号括起来:
let school = { "school name" : "Vivekananda School", }
与作为数字的属性名称一样,它们也必须使用括号表示法进行访问。比如,如果我们想从“Vivekananda学校”获取“Vivekananda”,我们可以这样做:
// bracket notation let school = { name: 'Vivekananda School' , displayInfo : function (){ console.log(`${school.name.split( ' ' )[0]}`); } } school.displayInfo(); // Vivekananda |
输出: 在上面的代码中,我们使用了括号表示法以及javascript提供的拆分方法,您将在本文中了解这些方法。
继承财产
对象的继承属性是从对象的原型继承的属性,而不是为对象本身定义的属性,即对象的自身属性。要验证某个属性是否为对象自己的属性,可以使用 hasOwnProperty
方法
属性属性 JavaScript中的数据属性有四个属性。
- 价值: 财产的价值。
- 可写: 如果为true,则可以更改属性的值
- 可列举: 如果为true,则该属性可以通过“for in”枚举进行迭代。否则,该属性称为不可枚举。
- 可配置: 如果为false,则尝试删除属性、将属性更改为访问或属性、或更改其属性(而不是[[Value]],或将[[Writable]]更改为false)将失败。
// hasOwnProperty code in js const object1 = new Object(); object1.property1 = 42; console.log(object1.hasOwnProperty( 'property1' )); // true |
输出:
创建对象
创建对象有几种方法或语法。其中一种被称为Object literal语法,我们已经使用过了。除了对象文字语法,JavaScript中的对象还可以使用构造函数、对象构造函数或原型模式创建。
- 使用对象文字语法: 对象文字语法使用{…}符号直接初始化对象及其方法/属性。 让我们来看一个使用此方法创建对象的示例:
var obj = { member1 : value1, member2 : value2, };
这些成员可以是任何东西——字符串、数字、函数、数组甚至其他对象。这样的对象称为对象文字。这与其他创建对象的方法不同,后者涉及使用构造函数、类或原型,下文将对此进行讨论。
- 对象构造函数: 在JavaScript中创建对象的另一种方法是使用“对象”构造函数。对象构造函数为给定值创建对象包装器。这与“new”关键字结合使用,允许我们初始化新对象。 例子:
const school =
new
Object();
school.name =
'Vivekanada school'
;
school.location =
'Delhi'
;
school.established = 1971;
school.displayInfo =
function
(){
console.log(`${school.name} was established
in
${school.established} at ${school.location}`);
}
school.displayInfo();
输出:
上面提到的两种方法不太适合需要创建多个同类对象的程序,因为它需要为每个此类对象重复编写上述代码行。为了解决这个问题,我们可以使用JavaScript中的另外两种对象创建方法来显著减少这个负担,如下所述:
- 施工人员: 与大多数其他OOP语言一样,JavaScript中的构造函数提供了创建对象的模板。换句话说,它定义了一组属性和方法,这些属性和方法对于使用构造函数初始化的所有对象都是通用的。 让我们来看一个例子:
function
Vehicle(name, maker) {
this
.name = name;
this
.maker = maker;
}
let car1 =
new
Vehicle(
'Fiesta'
,
'Ford'
);
let car2 =
new
Vehicle(
'Santa Fe'
,
'Hyundai'
)
console.log(car1.name);
// Output: Fiesta
console.log(car2.name);
// Output: Santa Fe
输出:
注意在功能车辆之前使用“new”关键字。在任何函数将其转换为构造函数之前,以这种方式使用“new”关键字。“new Vehicle()”实际上做的是:
- 它创建一个新对象,并将对象的构造函数属性设置为schools(需要注意的是,此属性是一个特殊的默认属性,不可枚举,无法通过手动设置“constructor:someFunction”属性来更改)。
- 然后,它设置要使用的对象
Vehicle
函数的prototype对象(JavaScript中的每个函数都会获得一个prototype对象,它最初只是一个空对象,但可以修改。实例化时,该对象将继承其构造函数的prototype对象的所有属性)。 - 然后在新对象的上下文中调用Vehicle(),这意味着当构造函数(Vehicle())中遇到“this”关键字时,它指的是在第一步中创建的新对象。
- 完成后,新创建的对象将返回到car1和car2(在上面的示例中)。
在类内部,可以有名为
constructor()
.class people {
constructor()
{
this
.name =
"Adam"
;
}
}
let person1 =
new
people();
// Output : Adam
console.log(person1.name);
输出:
在一个名为的类中有多个函数
constructor()
结果导致了一个错误。 - 原型: 另一种创建对象的方法是使用原型。每个JavaScript函数都有一个
prototype
对象属性(默认为空)。方法或属性可以附加到此属性。对原型的详细描述超出了本对象介绍的范围。 但是,您可以熟悉以下使用的基本语法:let obj = Object.create(prototype_object, propertiesObject) // the second propertiesObject argument is optional
使用该对象的示例。create()方法是:
let footballers = {
position:
"Striker"
}
let footballer1 = Object.create(footballers);
// Output : Striker
console.log(footballer1.position);
输出:
在上面的示例中,footballers作为创建对象“footballer1”的原型。
以这种方式创建的所有对象都从其原型对象继承所有属性和方法。原型可以有原型,那些可以有原型等等。这在JavaScript中称为原型链接。这条链以
Object.prototype
这是所有对象的默认原型回退。默认情况下,Javascript对象从对象继承属性和方法。但这些可能很容易被推翻。还值得注意的是,默认原型并不总是对象。原型例如,字符串和数组有自己的默认原型——字符串。原型和阵列。分别是原型。
访问对象成员
对象成员(属性或方法)可以通过以下方式访问:
- 点符号:
(objectName.memberName)
let school = {
name :
"Vivekanada"
,
location :
"Delhi"
,
established : 1971,
20 : 1000,
displayinfo :
function
() {
console.log(`${school.name} was established
in
${school.established} at ${school.location}`);
}
}
console.log(school.name);
console.log(school.established);
输出:
- 括号符号:
objectName["memberName"]
let school = {
name :
"Vivekanada School"
,
location :
"Delhi"
,
established : 1995,
20 : 1000,
displayinfo :
function
() {
document.write(`${school.name} was established
in
${school.established} at ${school.location}`);
}
}
// Output : Vivekanada School
console.log(school[
'name'
]);
// Output: 1000
console.log(school[
'20'
]);
输出:
与点符号不同,括号关键字适用于任何字符串组合,包括但不限于多字字符串。 例如:
somePerson.first name // invalid somePerson["first name"] // valid
与点表示法不同,括号表示法还可以包含在运行时计算其值的任何表达式变量的结果。 例如:
let key = "first name" somePerson[key] = "Name Surname"
使用点表示法时,不可能进行类似的操作。
迭代对象的所有键
要迭代对象的所有现有可枚举键,我们可以使用 for...in
建筑值得注意的是,这只允许我们访问对象的可枚举属性(回想一下,可枚举是数据属性的四个属性之一)。 例如,从对象继承的属性。原型是不可枚举的。但是,也可以使用 for...in
建筑 例子:
let person = { gender : "male" } var person1 = Object.create(person); person1.name = "Adam" ; person1.age = 45; person1.nationality = "Australian" ; for (let key in person1) { // Output : name, age, nationality // and gender console.log(key); } |
输出:
删除属性
要删除对象的属性,我们可以使用 delete
操作人员下面列出了其使用示例:
let obj1 = { propfirst : "Name" } // Output : Name console.log(obj1.propfirst); delete obj1.propfirst // Output : undefined console.log(obj1.propfirst); |
输出:
需要注意的是,我们不能以这种方式删除继承属性或不可配置属性。 例如:
let obj1 = { propfirst : "Name" } // Output : Name console.log(obj1.propfirst) let obj2 = Object.create(obj1); // Output : Name console.log(obj2.propfirst); // Output : true. console.log( delete obj2.propfirst); // Surprisingly Note that this will return true // regardless of whether the deletion was successful // Output : Name console.log(obj2.propfirst); |
输出: