趣谈 JavaScript 中的原型机制,与众不同的面向对象方式
2023-10-03 09:07:27
在上一节多次提到[[Prototype]]链,但没解释它到底是什么,那么这一节我们来详细介绍一下。
JavaScript中的每个对象都拥有一个原型对象。其实就是对于其他对象的引用。几乎所有的对象在创建时[[Prototype]]属性都会被赋予一个非空的值。原型对象也可能拥有原型对象,它们之间通过[[Prototype]]连接起来,形成一个从子到父的链条,这个链条就叫做原型链。
原型链的作用是:当一个对象试图访问一个它没有的属性时,它会沿着原型链向上查找,直到找到该属性或到达原型链的尽头(即Object.prototype)。如果在原型链中找到了该属性,则使用该属性的值。如果在原型链中找不到该属性,则返回undefined。
原型链的存在使得JavaScript中的对象可以继承其他对象的属性和方法。这是一种非常灵活的继承机制,它允许我们创建出复杂的对象结构。
需要注意的是,原型链并不是JavaScript中唯一的继承机制。JavaScript还支持另一种继承机制,叫做“类继承”。类继承是一种更传统的继承机制,它允许我们创建出具有相同属性和方法的对象。
原型继承和类继承各有优缺点。原型继承更加灵活,它允许我们创建出更复杂的对象结构。类继承更加简单,它更容易理解和使用。在实际开发中,我们可以根据具体情况选择使用哪种继承机制。
下面我们通过一个例子来演示原型链是如何工作的。
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log("Hello, my name is " + this.name);
};
var person1 = new Person("John");
person1.sayHello(); // Hello, my name is John
var person2 = new Person("Mary");
person2.sayHello(); // Hello, my name is Mary
在这个例子中,Person是一个构造函数,它创建Person对象。Person.prototype是一个对象,它包含Person对象的所有属性和方法。person1和person2是Person对象的实例。
当person1调用sayHello()方法时,JavaScript会首先在person1对象中查找sayHello()方法。如果没有找到,它会沿着原型链向上查找,直到找到sayHello()方法或到达原型链的尽头。在这个例子中,JavaScript会找到Person.prototype.sayHello()方法,并使用它来执行person1.sayHello()方法。
同理,当person2调用sayHello()方法时,JavaScript也会沿着原型链向上查找,直到找到sayHello()方法或到达原型链的尽头。在这个例子中,JavaScript也会找到Person.prototype.sayHello()方法,并使用它来执行person2.sayHello()方法。
原型链是一个非常重要的概念,它使得JavaScript中的对象可以继承其他对象的属性和方法。这是一种非常灵活的继承机制,它允许我们创建出复杂的对象结构。