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操作符来确定对象的构造函数和类型。