JavaScript prototype(原型对象)


JavaScript Prototype(原型对象)

在JavaScript中,每一个对象都有一个指向原型对象的指针。原型对象是该对象的原型,定义了属性和方法,这些属性和方法可以被对象继承和共享。当我们需要创建一个对象,JavaScript会自动给这个对象分配一个原型对象。

原型链

当对象需要访问属性或方法时,JavaScript首先会查找其本身是否有该属性或方法,如果没有,它会顺着原型链向上查找,直到找到为止。原型链是由每一个对象的原型对象所连成的链条,最终会指向Object.prototype。

原型对象的创建

我们可以使用构造函数来创建对象,每一个构造函数都有一个prototype属性,这个属性可以被所有该构造函数创建的对象所继承和共享。我们可以在prototype属性上添加属性和方法,这些属性和方法可以被所有该构造函数创建的对象所继承和共享。例如:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

Person.prototype.sayHi = function() {
  console.log(`Hi, I'm ${this.name}.`);
}

let person1 = new Person('Alice', 20);
let person2 = new Person('Bob', 25);

person1.sayHi(); // Hi, I'm Alice.
person2.sayHi(); // Hi, I'm Bob.

在这个例子中,我们给Person.prototype添加了sayHi方法,这个方法可以被所有由Person构造函数创建的对象所共享和继承。

继承

JavaScript的继承是通过原型链来实现的。如果我们需要让一个对象继承另一个对象的某些属性和方法,可以通过将该对象的原型对象指向另一个对象来实现。例如:

function Animal() {
  this.species = 'animal';
}

function Cat(name, age) {
  this.name = name;
  this.age = age;
}

Cat.prototype = new Animal();

let cat = new Cat('Kitty', 2);

console.log(cat.species); // animal

在这个例子中,我们给Cat.prototype指向了一个Animal的实例,这样Cat的实例cat就可以继承Animal的species属性。在查找cat.species时,JavaScript首先会查找cat本身是否有该属性,没有的话会顺着原型链向上查找,最终查找到Animal.prototype.species。

constructor(构造函数)

每个原型对象都有一个constructor属性,指向该原型对象的构造函数。例如:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

console.log(Person.prototype.constructor === Person); // true

在这个例子中,Person.prototype的constructor属性指向Person构造函数本身。

instanceof(实例类型)

我们可以使用instanceof操作符来判断一个对象是否为某个构造函数的实例。例如:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

let person = new Person('Alice', 20);

console.log(person instanceof Person); // true

在这个例子中,person是Person构造函数的实例,所以返回true。

总结

原型对象是JavaScript中的一个重要概念,每一个对象都有一个指向原型对象的指针,可以通过原型链找到其原型对象和共享属性和方法。我们可以通过构造函数的prototype属性来创建原型对象并添加属性和方法,通过将一个对象的原型对象指向另一个对象实现继承,并通过constructor属性和instanceof操作符来确定对象的构造函数和类型。