共计 988 个字符,预计需要花费 3 分钟才能阅读完成。
– JS 是一个非常有魅力的语言也是一个比较烦人的语言,主要就是因为他的特殊性灵活性。
JS 的原型链,需要深刻的研究才能搞懂。不要纠结细节吧。实在不行就按这个死背住,慢慢就理解了。总之吧就是一句话万物皆对象。
结合这个图示仔细理解吧。在你搞懂后你会发现。很嗨很刺激!
下面是必须记住的点。基础知识不用说了吧。
对象都是通过函数(即构造函数)创建的。函数也是一个对象,即属性的集合,所以也可以对函数进行自定义属性。
每个函数默认的有一个 prototype 属性。这个 prototype 的属性值是一个对象,默认的只有一个 construct 属性指向函数本身。
每个对象都有一个隐藏的属性——“__proto__”,这个属性引用了创建这个对象的函数的 prototype。即:fn.__proto__ === Fn.prototype 这里的 ”__proto__” 成为“隐式原型”。
对象的 construct 属性指向构造函数。而构造函数的 construct 属性指向自身。
回答什么是 JS 的原型链?
访问一个对象的属性时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链。这个对象的__proto__等于这个对象构造方法的 prototype。这个对象的构造函数的 prototype 是一个对象。这个对象是被 Object() 创建出来的。(Object() 是 JS 内部定义好的。)所以它的__proto__就等于 Object.prototype。Object.prototype 等于 null。到此就是原型链的终结。
然后呢还有一个点。
函数可以是一个普通函数也可以作为构造函数去创建对象。当这个时候构造函数就和 Object() 函数是一个作用:作为构造函数去生成对象。普通构造函数和 Object 一样的 他既是函数也是对象。他的__proto__指向于 Function.prototype。这也是 JS 内部定义好的。Function.__proto__指向 Function.prototype 有点鸡生蛋蛋生鸡的意思(Function 是被自己创建的)。这里是一个循环引用。Function.prototype 也是一个对象,他的__proto__指向于 Object.prototype。Object.prototype 等于 null。走到原型链的终结。
以上就是我对 JS 原型链的理解,有什么错误的地方希望大家指出。