JavaScript中的原型链是什么?
介绍JavaScript中的原型链概念和实现方式
JavaScript中的原型链是一种用于实现继承的机制。每个JavaScript对象都拥有一个原型(prototype)属性,它指向另一个对象,而这个对象又有自己的原型,依此类推,一直到最终的原型为null,以形成一个链式的引用结构,这就是JavaScript中的原型链。
在JavaScript中,访问一个对象的属性时,会先在该对象自身查找,如果找不到,则会沿着该对象的原型链往上查找,直到查找到原型链的顶端为止。如果还是没有找到,则返回undefined。这种机制实现了原型继承,子类可以继承父类的属性和方法,节省了代码量,提高了可复用性。
JavaScript中的原型链是通过对象的3个属性来实现的:__proto__、prototype和constructor。
__proto__
每个JavaScript对象都有一个名为__proto__的隐藏属性,它指向该对象的原型。比如,执行以下代码:“`
let obj = {};
console.log(obj.__proto__);
“`输出结果为:
“`
Object.prototype
“`Object.prototype是所有JavaScript对象的最顶层的原型对象。可以通过它来访问一些通用的方法和属性,比如toString()方法。
prototype
在JavaScript中,函数也是对象,每个函数都有一个prototype属性,它指向一个对象,是该函数所创建的所有对象的原型。比如,执行以下代码:“`
function Person(){}
console.log(Person.prototype);
“`输出结果为:
“`
Person {}
“`Person.prototype就是Person函数所创建的所有对象的原型对象,它包含了所有该函数下的公共方法和属性。
constructor
每个JavaScript对象都有一个名为constructor的属性,它指向该对象的构造函数。比如,执行以下代码:“`
let obj = {};
console.log(obj.constructor);
“`输出结果为:
“`
function Object() { [native code] }
“`obj的构造函数是Object()。构造函数是用来创建对象的函数,它有一个prototype属性,指向该函数所创建的所有对象的原型对象。
由上述介绍可知,JavaScript中的原型链是通过对象的__proto__属性实现的。当访问一个对象的属性时,JavaScript引擎首先在该对象自身查找,如果找不到,则沿着该对象的__proto__属性往上查找,找到第一个包含该属性的对象,即返回该属性的值。如果一直到原型对象仍然没找到,返回undefined。
下面是一个实现原型链继承的例子:
“`
function Animal(name){
this.name = name;
}
Animal.prototype.sayName = function(){
console.log(this.name);
}function Dog(name){
Animal.call(this, name);
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;let dog = new Dog(‘小狗’);
dog.sayName(); //输出:小狗
“`在这个例子中,我们定义了一个Animal构造函数,里面有一个属性和一个方法。我们又定义了一个Dog构造函数,继承了Animal构造函数,这里用到了Animal.call(this, name)来实现。接着,我们设置了Dog.prototype的值为Animal.prototype的一个新实例,这样,Dog创建的对象就可以继承Animal的方法和属性了。最后,我们将Dog.prototype.constructor设置为Dog本身,以保证constructor指向Dog构造函数。
总结:
JavaScript中的原型链是用于实现继承的机制。每个对象都有一个原型属性,指向另一个对象,形成一个链式的引用结构,一直到原型为null为止。对象的__proto__、prototype和constructor属性是实现原型链的重要组成部分。原型链的机制可以实现原型继承,提高代码可复用性,并节省代码量。
2023年06月10日 16:58