返回
探寻原型奥秘:揭秘原型与原型链的上篇
前端
2023-11-10 21:21:54
在JavaScript中,原型和原型链是两个密不可分且极为重要的概念,它们共同构成了对象继承体系。理解原型和原型链不仅能帮助我们更深入地理解JavaScript的运行机制,也能更好地掌握对象继承的原理,从而写出更加健壮的代码。
## 函数对象
在JavaScript中,函数不仅可以用来执行代码,还是一种特殊的对象,称为函数对象。函数对象拥有自己的属性和方法,其中一个重要的属性就是prototype,它是指向该函数的原型对象的指针。
例如,我们可以创建一个函数对象fun,并使用fun.prototype访问其原型对象:
function fun() {}
console.log(fun.prototype);
// 输出:{}
在上面的代码中,fun.prototype是一个空对象,因为它尚未被赋值。接下来,我们可以通过fun.prototype = {}将一个新对象赋给fun.prototype,这样fun的原型对象就有了属性和方法:
fun.prototype = {
name: "fun",
sayHello: function() {
console.log("Hello from " + this.name);
}
};
console.log(fun.prototype);
// 输出:{ name: "fun", sayHello: [Function: sayHello] }
现在,fun的原型对象拥有了两个属性:name和sayHello。我们可以通过fun.prototype.name和fun.prototype.sayHello来访问这些属性和方法。
## 构造函数
在JavaScript中,构造函数是一种特殊的函数,用于创建对象。当调用构造函数时,会创建一个新的对象,该对象会继承构造函数的prototype属性。
例如,我们可以创建一个构造函数Person,并使用它来创建对象:
function Person(name) {
this.name = name;
}
const person1 = new Person("John");
console.log(person1);
// 输出:{ name: "John" }
console.log(person1.proto);
// 输出:{ constructor: [Function: Person], name: "fun", sayHello: [Function: sayHello] }
在上面的代码中,Person是构造函数,person1是使用Person创建的对象。person1.__proto__指向Person的prototype属性,而Person的prototype属性指向fun的prototype属性。因此,person1可以继承fun的prototype属性中的name和sayHello属性和方法。
## 原型
原型是对象的一个属性,指向该对象继承自的原型对象。原型对象包含了该对象可以访问的属性和方法。
例如,在上面的代码中,person1的原型对象是Person.prototype,而Person.prototype的原型对象是fun.prototype。因此,person1可以访问fun.prototype中的name和sayHello属性和方法。
原型链是原型对象之间的连接链。它从对象开始,一直向上追溯到最顶层的原型对象。原型链使对象能够访问其原型对象中的属性和方法,从而实现继承。
## 总结
原型和原型链是JavaScript中的两个重要概念,它们共同构成了对象继承体系。理解原型和原型链不仅能帮助我们更深入地理解JavaScript的运行机制,也能更好地掌握对象继承的原理,从而写出更加健壮的代码。