📜  解释 JavaScript 中的原型继承(1)

📅  最后修改于: 2023-12-03 15:11:57.896000             🧑  作者: Mango

JavaScript中的原型继承

在JavaScript中,每个对象都有一个[[Prototype]]属性,该属性指向一个被称为原型的对象。当我们访问一个对象的属性时,如果该属性不存在于该对象中,则JavaScript引擎将从该对象的原型中查找该属性,如果仍然找不到,则继续查找原型的原型,以此类推,直到找到属性或抵达原型链的末尾null。这就是JavaScript中的原型继承机制。

创建对象的方式

在JavaScript中,有多种方式可以创建对象。下面是一些常见的方式:

1. 对象字面量

const person = {
  name: 'John',
  age: 30,
  sayHello: function() {
    console.log('Hello!');
  }
};

2. 构造函数

function Person(name, age) {
  this.name = name;
  this.age = age;
  this.sayHello = function() {
    console.log('Hello!');
  }
}

const john = new Person('John', 30);

3. Object.create

const person = {
  name: 'John',
  age: 30,
  sayHello: function() {
    console.log('Hello!');
  }
};

const john = Object.create(person);
原型

在JavaScript中,每个对象都有一个[[Prototype]]属性,用于指向它的原型。我们可以使用Object.getPrototypeOf方法来获取对象的原型,例如:

const person = {
  name: 'John',
  age: 30,
  sayHello: function() {
    console.log('Hello!');
  }
};

const john = Object.create(person);

console.log(Object.getPrototypeOf(john)); // 输出: {name: 'John', age: 30, sayHello: ƒ}
原型继承

原型继承是指将一个对象的原型指向另一个对象,从而继承其属性和方法。在JavaScript中,可以通过Object.create方法来实现原型继承。例如:

const person = {
  name: 'John',
  age: 30,
  sayHello: function() {
    console.log('Hello!');
  }
};

const john = Object.create(person);

console.log(john.name); // 输出:'John'
john.sayHello(); // 输出:'Hello!'

在这个例子中,我们将john的[[Prototype]]属性指向了person对象,因此john可以继承person对象的属性和方法。

原型链

在JavaScript中,每个对象都有一个[[Prototype]]属性,它指向该对象的原型。如果该原型对象本身也有一个[[Prototype]]属性,则继续向上查找,直到找到一个没有[[Prototype]]属性的对象为止,这个对象就是原型链的末端。

例如:

const person = {
  name: 'John'
};

const john = Object.create(person);

const student = Object.create(john);

console.log(student.name); // 输出:'John'

在这个例子中,student对person的[[Prototype]]进行了两次继承,因此它能够访问到person对象中的属性。

原型继承VS经典继承

JavaScript中的原型继承与传统的基于类的继承有所不同。传统的继承是通过类定义并创建对象,而对象继承了类的的属性和方法。在原型继承中,对象之间是通过继承其它对象来共享属性和方法的。这种动态特性使得JavaScript中的原型继承更加灵活和适应性更强。

总结

在JavaScript中的原型继承是通过[[Prototype]]属性实现的,每个对象都有一个[[Prototype]]属性,指向该对象的原型。通过原型链,可以访问到原型链上的属性和方法。原型继承是一种灵活而强大的继承方式,可以用于创建各种类型的对象和数据结构。