对象与原型:探秘JavaScript对象继承的奥妙
2023-11-16 09:29:13
JavaScript中的对象
对象是JavaScript中的一种基本数据类型,它可以存储键值对,键是一个字符串,值可以是任何类型的数据,包括另一个对象。对象可以通过{}
表示,键和值之间用冒号分隔,多个键值对之间用逗号分隔。
例如:
const person = {
name: "John",
age: 30,
city: "New York",
};
对象的创建方式
对象可以在JavaScript中通过多种方式创建:
- 对象字面量 :这是创建对象最常用的方法,如上面的例子所示。
- new操作符 :
new
操作符可以用来创建内置对象或自定义对象的实例。 - Object.create()方法 :
Object.create()
方法可以创建一个新对象,并指定其原型对象。
理解原型继承
原型继承是JavaScript中实现继承的一种机制。每个对象都有一个原型对象,原型对象也是一个对象,它包含了该对象的所有属性和方法。当一个对象访问一个不存在的属性或方法时,JavaScript会自动搜索其原型对象,如果在原型对象中找到了该属性或方法,则会将其返回。
例如:
const person = {
name: "John",
age: 30,
city: "New York",
};
const student = {
// 继承person对象的属性和方法
__proto__: person,
school: "Harvard University",
};
console.log(student.name); // "John"
console.log(student.age); // 30
console.log(student.city); // "New York"
console.log(student.school); // "Harvard University"
在这个例子中,student
对象继承了person
对象的属性和方法,因此它可以访问person
对象的所有属性和方法。
原型链
原型链是指一个对象的所有原型对象形成的链条。每个对象都有一个原型对象,原型对象也有一个原型对象,依此类推,直到遇到null
对象。
例如:
const person = {
name: "John",
age: 30,
city: "New York",
};
const student = {
// 继承person对象的属性和方法
__proto__: person,
school: "Harvard University",
};
const athlete = {
// 继承student对象的属性和方法
__proto__: student,
sport: "Basketball",
};
console.log(athlete.name); // "John"
console.log(athlete.age); // 30
console.log(athlete.city); // "New York"
console.log(athlete.school); // "Harvard University"
console.log(athlete.sport); // "Basketball"
在这个例子中,athlete
对象继承了student
对象的属性和方法,student
对象继承了person
对象的属性和方法,person
对象没有原型对象。因此,athlete
对象可以访问person
对象、student
对象和athlete
对象的所有属性和方法。
原型污染
原型污染是指修改原型对象,从而影响所有继承该原型对象的对象的行为。例如:
const person = {
name: "John",
age: 30,
city: "New York",
};
// 修改person对象的原型对象
person.__proto__.isAdmin = true;
const student = {
// 继承person对象的属性和方法
__proto__: person,
school: "Harvard University",
};
console.log(student.isAdmin); // true
在这个例子中,我们修改了person
对象的原型对象,添加了一个isAdmin
属性。现在,student
对象也可以访问isAdmin
属性,并返回true
。
避免原型污染
为了避免原型污染,可以采取以下措施:
- 不要直接修改原型对象。
- 使用
Object.create()
方法创建对象。 - 使用冻结对象(使用
Object.freeze()
方法)。
结语
原型继承是JavaScript中实现继承的一种机制,它允许对象继承另一个对象的所有属性和方法。原型链是指一个对象的所有原型对象形成的链条,每个对象都可以访问其原型链上的所有属性和方法。原型污染是指修改原型对象,从而影响所有继承该原型对象的对象的行为。为了避免原型污染,可以采取一些措施,如不要直接修改原型对象,使用Object.create()
方法创建对象,使用冻结对象等。