引言
在JavaScript中,原型(Prototype)和继承是两个核心概念,它们为对象提供了共享行为和属性的机制。
原型与原型链
原型对象
每个JavaScript对象都有一个关联的原型对象,原型对象可以提供该对象继承的属性和方法。可以通过对象的__proto__
属性访问其原型对象。
let obj = {};
console.log(obj.__proto__ === Object.prototype); // true
原型链
原型链是一系列对象的链接,用于实现继承。通过原型链,一个对象可以访问其他对象的属性和方法。
let obj = {};
console.log(obj.__proto__); // Object.prototype
console.log(obj.__proto__.__proto__); // null (Object.prototype 的原型是 null)
构造函数与原型
构造函数是一种用于创建对象的函数。每个构造函数都有一个prototype
属性,该属性指向一个对象,即原型对象。使用构造函数创建的对象将共享原型对象中的属性和方法。
示例
function Person(name) {
this.name = name;
}
Person.prototype.greet = function() {
console.log(`Hello, my name is ${this.name}`);
};
let alice = new Person('Alice');
alice.greet(); // 输出: Hello, my name is Alice
let bob = new Person('Bob');
bob.greet(); // 输出: Hello, my name is Bob
console.log(alice.__proto__ === Person.prototype); // true
console.log(bob.__proto__ === Person.prototype); // true
在这个示例中,Person
是一个构造函数,greet
方法被定义在Person.prototype
上。alice
和bob
对象通过构造函数创建,并共享Person.prototype
上的greet
方法。
继承机制
JavaScript通过原型链实现继承,子类对象可以继承父类对象的属性和方法。
原型继承
通过将一个对象的原型设置为另一个对象的实例,可以实现继承。
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name} makes a noise`);
};
function Dog(name) {
Animal.call(this, name); // 继承属性
}
Dog.prototype = Object.create(Animal.prototype); // 继承方法
Dog.prototype.constructor = Dog;
Dog.prototype.speak = function() {
console.log(`${this.name} barks`);
};
let dog = new Dog('Rex');
dog.speak(); // 输出: Rex barks
console.log(dog.__proto__ === Dog.prototype); // true
console.log(dog.__proto__.__proto__ === Animal.prototype); // true
在这个示例中,Dog
构造函数通过Animal.call(this, name)
继承了Animal
的属性,并通过Dog.prototype = Object.create(Animal.prototype)
继承了Animal
的原型方法。
实践应用
理解原型和继承可以帮助我们在实际编程中编写更高效的代码,避免重复定义相同的方法。
实现类与继承
在ES6中,引入了类(Class)语法,更加直观地实现继承。
class Animal {
constructor(name) {
this.name = name;
}
speak() {
console.log(`${this.name} makes a noise`);
}
}
class Dog extends Animal {
speak() {
console.log(`${this.name} barks`);
}
}
let dog = new Dog('Rex');
dog.speak(); // 输出: Rex barks
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true