【js基础修炼之路】— 我理解的原型链

提起原型链,大家并不陌生,但是对于新人来说一提到原型方面的东西就会比较懵。在我自一次面试的时候,面试官也给我提了这样的问题,当时就按照我的理解说了一些,但是很肤浅,在此我希望给刚入门的前端小伙伴聊一下我理解的原型链。


  • __ proto__

这个属性是每个对象都有的属性,指向创建该对象的构造函数原型,其实这个属性指向了 [[prototype]],但是 [[prototype]] 是内部属性,我们并不能访问到,所以使用 __ proto __ 来访问。

function add(){}
add.__proto__ === Function.prototype  //true

注意:
通过现代浏览器的操作属性的便利性,可以改变一个对象的 [[Prototype]] 属性, 这种行为在每一个JavaScript引擎和浏览器中都是一个非常慢且影响性能的操作,使用这种方式来改变和继承属性是对性能影响非常严重的,并且性能消耗的时间也不是简单的花费在 obj.__proto__ = ... 语句上, 它还会影响到所有继承来自该 [[Prototype]] 的对象,如果你关心性能,你就不应该在一个对象中修改它的 [[Prototype]].。相反, 创建一个新的且可以继承 [[Prototype]] 的对象,推荐使用 Object.create()


  • prototype 和 constructor

该属性只有函数才有,基本所有属性都有这个属性,但是有一个是例外:

Function.prototype.bind()

这个属性指的是对象的原型,该属性有一个属性constructor,constructor指向构造函数

function add(){}
add.constructor == Function //true

image.png


  • new 的时候干了些什么

    1.生成一个新对象 {}
    2.链接到原型
    设置新对象的constructor属性为构造函数的名称,设置proto属性指 向构造函数的原型对象,扩展了新对象的原型链。
    3.绑定this
    4.返回this指针
    下面是一个new的过程

new Person("John") = {
    var obj = {};
	obj.__proto__ = Person.prototype; // 此时便建立了obj对象的原型链:
	// obj->Person.prototype->Object.prototype->null
	var result = Person.call(obj,"John"); // 相当于obj.Person("John")绑定this指针
	return typeof result === 'object' ? result : obj; 
   // 如果无返回值或者返回一个非对象值,则将obj返回作为新对象
}

总结
1.__ proto __所有对象都有,指向构造该对象的原型
2.prototype是对象的原型,只有函数有
3.constrctor是prototype的属性,指向构造函数

记住,在你成功之前,每前进一步遇到的都将是更大的困难,所以微笑面对每一个困难 -----至有理想的自己
原文地址:https://www.cnblogs.com/-yu-ze-/p/10208689.html