1.什么是原型链
原型链就是当我们访问一个对象中的相关属性的时候,首先是在该对象中寻找是否含有该对象,如果找到就直接返回,若没找到则就会寻找该对象的隐示原型上去寻找,即为其构造函数的显示原型对象上寻找,若仍未找到,则就会在其构造函数的隐实原型上去寻找,就样一层一层的往上寻找,就会形成一个链式结构,我们称之为原型链。如果找到顶层的Object.prototype仍未找到该属性,则会返回一个undefined
2.原型链的具体展示
我们可以从下面的相关代码中可以看出
一、我们构建了一个构造函数,并且通过给构造函数的原型对象上添加了一个father属性。
二、然后我们通过new一个构造函数的实例对象,然后访问对象上的相关方法以及属性。
三、大致的寻找流程为,首先在child上寻找是否有father,toString等方法或属性,发现没有则通过child的隐示原型对象即构造函数的显示原型对象上去寻找上述的属性或方法,然后发现有facher的属性,然后在通过显示原型的隐示原型对象即object上去寻找,发现找到了即返回。
function Person(name){
this.name = name
}
Person.prototype.father = '王五'
var child = new Person('李四')
console.log(child);
console.log(child.father);
console.log(child.toString);
3.原型链的特点及运用
原型链只是用来查找对象上是否有对应的属性或方法,若没有则通过其隐示原型一层一层的查询,不能修改对应的属性,如下代码
在下面的代码中我们通过Person构造函数构造了两个实例对象,并给其中一个添加了father属性。可能你就会认为,没错,child中没有father属性,然后通过原型链去寻找,找到了然后修改了对应的属性值。所以后面的fahter属性都是李四了,然后却不是这样。通过运行我们发现,虽然child的father是李四但是并不是修改了原型对象上的属性,而是给实例对象上添加了一个father属性,其值对应的是李四罢了。
function Person(){
}
Person.prototype.father = '王五'
var child = new Person()
child.father = '李四'
var children = new Person()
console.log(child);
console.log(child.father);
console.log(children);
console.log(children.father);
那么我们该怎么样进行使用原型链呢?我们可以给构造函数的原型对象上添加修改等方法。然后通过实例对象来进行调用,即实例对象的隐实原型这条道路来进行调用,有点类似于java中的set和getter方法
function Person(name){
this.name = name
}
Person.prototype.setName = function(name){
this.name = name
}
var child = new Person('李四')
var children = new Person('王五')
children.setName('赵六')
console.log(child);
console.log(child);
console.log(children);
console.log(children);
4.原型链的相关总结
原型链是 JavaScript 中一个重要的概念,它描述了对象之间的继承关系。每个 JavaScript 对象都有一个内部链接到另一个对象,这个链接就是原型链。
在 JavaScript 中,每个对象都有一个内部属性 proto,它指向了该对象的原型。原型本身也是一个对象,因此它也有自己的 proto 属性,指向其自己的原型。这样一直向上追溯,就形成了一个链式结构,这个结构就是原型链。
在查找对象的属性时,如果对象本身没有这个属性,JavaScript 引擎就会沿着这个对象的原型链向上查找,直到找到该属性为止。如果一直到最顶层的 Object.prototype 都没有找到这个属性,那么就会返回 undefined。
原型链的特点是:
每个对象都有一个原型,原型也是一个对象,因此原型也有自己的原型,形成了一个链式结构。
当查找一个对象的属性时,如果该对象本身没有这个属性,就会沿着它的原型链向上查找,直到找到该属性或者查找到最顶层的 Object.prototype 为止。
如果最终仍然没有找到这个属性,就会返回 undefined。
原型链在 JavaScript 中是实现继承的重要手段,它可以让我们在不必复制大量代码的情况下,快速创建新的对象,并继承已有对象的属性和方法。同时,原型链还有助于理解 JavaScript 中对象的继承机制。