返回

对象与原型:探秘JavaScript对象继承的奥妙

前端

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()方法创建对象,使用冻结对象等。