原型和原型链

0 阅读2分钟

原型和原型链

先做一个小试题,答案在最后:

function star(name){
    this.name = name
}
const jenkchen = new star("chenglong")
// 这个实例的原型链
//  构造函数的原型链
// 现在通过构造函数创建一个实例之后,这个实例其实是可以访问到原型对象上的一些属性和方法的,假如给你一个其他函数的方法
function perpoe(){
}
perpoe.prototype.sayName(){
}
console.log(jenkchen.sayName()) //这个需要怎么做

一个对象在一开始进行创建的时候就和另外一个对象进行关联,去继承另外一个对象的属性和方法,这另一个对象就是原型。

如图:我定义了一个空对象,给他绑定了一个属性sayHello,然后使用hasOwnProperty去看他有没有这个属性,但是我没有给他绑定这个方法,他是为什么会有这个方法呢?那这就是原型,他继承了原型上的属性和方法。

所谓原型链就是我们在查找一个属性或者方法的时候,会先在自身查找,如果查找不到,那就去他的__proto__上查找,如果他的__proto__没有的话,他又会有自己的__proto__,直到找到object的__proto__,没有找到最后就返回null。

为了不需要重复创建多个实例对象,实例的__proto__指向了构造函数的prototype。

所以在查找的时候会先在自身查找,然后找自身的__proto__,这个时候可以委托给构造函数的prototype,构造函数又会有自己的prototype,然后找到原型链的顶端。

原型链试题解析:

这个jenkchen实例的原型链,

首先他会在自身查找,找不到然后就会去他的__proto__上查找,这个时候就会委托给star.prototype,然后去查找这个方法,然后找到Object.prototype,原型链的顶端,这个时候找不到就会返回为空。结果为:

//jenkchen——》jenkchen.__proto__——》star.prototype——》object.prototye——》null

star构造函数的原型链

首先他也会在自身查找,如果找不到就在自身的__proto__上查找,这个时候所有函数都继承来自Function.protype,然后以此类推.

//star——》star.__proto__ => Function.protype——》object.prototye——》null

要想让jenkchen共享person的属性和方法,可以修改star构造函数原型的指向,来实现继承。

// Object.create()会创建一个新对象,第一个参数接收一个对象,将会作为新创建对象的原型对象,
star.prototype = Object.create(Perpoe.portotype)
star.prototype.constructor = Star //修复constructor的指向
 
// 修改后的原型链:jenkchen——》jenkchen.__proto__——》star.prototype——》Perpoe.prototype——》object.prototye——》null