首页 > 编程知识 正文

对js原型链的理解,js原型和原型链的概念

时间:2023-05-06 03:30:19 阅读:242347 作者:2434

关于原型链我的理解是一个构造函数的原型作为另一个构造函数的实例形成的继承关系
在JS高级程序设计中有这样一个图

当我们定义一个函数时会有一个原型,即图中的SuperType Prototype,这时原型对象中会有一个constructor指向构造函数SuperType,这便是构造函数与原型对象之间的关系;

function Super(){ this.name='bob'; this.age=20;}

此时如果再定义一个SubType构造函数,把SubType prototype作为构造函数SuperType的实例,便会有[[Prototype]]指向SuperType Prototype这样便形成了原型链,注意SubType Prototype已经没有constructor

function Super(){ this.name='bob'; this.age=20;}function Person(){};Person.prototype = new Super();

原型链中的继承
上面代码中Person构造函数和prototype里什么也没定义,但是我们现在对Person进行实例,事实上我们是可以取到值的

var person = new Person();console.log(person.name); //'bob'console.log(person.age); //20

通过chrome控制台的打印我们可以发现这种继承关系,__prototo__:Super由Person.prototype = new Super(); 存在Super中的属性;

constructor指向变化
JS高级程序设计说如果一个构造函数的原型对象作为另一个构造函数的实例,那么作为实例的原型对象的constructor就会消失,从上图中我们也能发现绿色框中没有constructor属性,这里当时我在想如果直接手动将constructor指为Person这个构造函数原型链是否会断裂

function Super(){ this.name='bob'; this.age=20;}function Person(){};Person.prototype = new Super();Person.prototype.constructor = Person;console.log(Person.prototype);var person=new Person();console.log(person);

通过在控制台中打印可以发现constructor这里只作为一个属性,值为Person这个构造函数,而真正的影响指向的constructor为灰色

因此可以推断不存在手动更改constructor指向这么一说

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。