能够把这个讲清楚弄明白是一件很困难的事,首先明白原型是什么,在 ES6 之前,JS 没有类和继承的概念,JS 是通过原型来实现继承的,在 JS 中一个构造函数默认带有一个 prototype 属性,这个的属性值是一个对象,同时这个 prototype 对象自带有一个 constructor 属性,这个属性指向这个构造函数,同时每一个实例都会有一个_proto_属性指向这个 prototype 对象,我们可以把这个叫做隐式原型,我们在使用一个实例的方法的时候,会先检查这个实例中是否有这个方法,没有的话就会检查这个 prototype 对象是否有这个方法,基于这个规则,如果让原型对象指向另一个类型的实例,即constructor1.protoytpe=instance2,这时候如果试图引用 constructor1 构造的实例 instance1的某个属性 p1,首先会在 instance1 内部属性中找一遍,接着会在 instance1._proto_(constructor1.prototype)即是 instance2 中寻找 p1搜寻轨迹:instance1->instance2->constructor2.prototype……->Object.prototype;这即是原型链,原型链顶端是 Object.prototype类别:js / 日期:2022-11-16 / 浏览:575 / 评论:0
每个函数都有一个 prototype 属性,这个属性指向了一个对象,这个对象正是调用该函数而创建的实例的原型,那么什么是原型呢,可以这样理解,每一个 JavaScript 对象在创建的时候就会预制管理另一个对象,这个对象就是我们所说的原型,每一个对象都会从原型继承属性,如图:
接下来讲解实例和原型的关系:当读取实例的属性时,如果找不到,就会查找与对象相关的原型中的属性,如果还查不到,就去找原型的原型,一直找到最顶层,那么原型的原型是什么呢,首先,原型也是一个对象,既然是对象,我们就可以通过构造函数的方式创建它,所以原型对象就是通过 Object 构造函数生成的,如图:
constructor:
function Person(){
}
var person = new Person();
console.log(Person === person.constructor);



发表评论 / 取消回复