美文网首页让前端飞原型链
重学JS(十四)—— 一直被忽略的原型链

重学JS(十四)—— 一直被忽略的原型链

作者: 闪闪发光的狼 | 来源:发表于2018-08-02 00:15 被阅读19次

早已认为自己已经掌握了原型链,直到遇到这几个问题

Object.__proto__ == Object.prototype  //false
Object.__proto__ == Function.prototype  //true

__proto__倒是经常见,但没有去思考它和prototype的区别。

概念

对象具有属性__proto__,可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问到构造函数原型中定义的属性和方法。
方法(Function)方法这个特殊的对象,除了和其他对象一样有上述__proto__属性之外,还有自己特有的属性——原型属性(prototype),这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法。

new

上面的理论始终离不开构造函数四个字,不如先看看new 干了什么
1.先创建了一个新的空对象
2.然后让这个空对象的__proto__指向函数的原型prototype
3.将对象作为函数的this传进去,返回创建的这个对象
看到没,第二步!将对象的__proto__指向函数的原型prototype。看文字不清楚的话,用代码模拟下

function New(Foo){
  const o = new Object(); //创建了一个新的空对象o
  o.__proto__ = Foo.prototype; //让这个o对象的__proto__指向函数的原型prototype
  Foo.call(o); //this指向o对象
  return o;
}

所以很明了了,这些问题再也难不倒你

var a = {};
a.__proto__ == Object.prototype;  //a调用了Object构造函数,所以__proto__指向Object.prototype
var b = function(){}
b.__proto__ == Function.prototype  //b调用了Function构造函数,所以__proto__指向Function.prototype
b.__proto__.__proto__ == Object.prototype //Function.prototype是个对象,所以它的__proto__指向Object.prototype
Object.__proto__ == Function.prototype //Object作为一个函数对象,它的__proto__指向构造函数Function的prototype
Object.prototype.__proto__== null  //Object.prototype是一切的源头,所以它的__proto__是null。

但是也有小例外

var obj1 = {a:1};
var obj2 = Object.create(obj1);
obj2.__proto__ == Object.prototype   //false
obj2.__proto__  == obj1;  //true

这函数是用现有对象为原型,即__proto__来创建一个新对象。

原型链

有如下代码

function A(){}
A.prototype.c = 1;
var a = new A();
a.c;  //1

那么它对应的原型链



a寻找自己的属性c没有找到,就顺着__proto__找到了A.prototype,它有属性c,所以a.c的值是1。

总结

prototype是函数才有的属性,class也可以当作构造函数,所以它也有。__proto__是每个对象都有的属性,它指向该对象的构造函数的prototype。

相关文章

  • 重学JS(十四)—— 一直被忽略的原型链

    早已认为自己已经掌握了原型链,直到遇到这几个问题 __proto__倒是经常见,但没有去思考它和prototype...

  • 廖雪峰JS小记

    (function(){})() 原型,原型链 浅谈Js原型的理解JS 原型与原型链终极详解 对象 对象:一种无序...

  • 【重学】原型链

    大纲:构造函数手写new命令原型链Object对象的相关方法 (x)易错点 constructor表示构造函数和原...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • Javascript(三)之原型继承理解

    进阶路线 3 原型继承 3.1 优秀文章 最详尽的 JS 原型与原型链终极详解 一 最详尽的 JS 原型与原型链终...

  • 从实现角度分析js原型链

    从实现角度分析js原型链 欢迎来我的博客阅读:《从实现角度分析js原型链》 网上介绍原型链的优质文章已经有很多了,...

  • JS原型链

    1什么是JS原型链? 通过__proto__属性将对象与原型对象进行连接. 1.1 JS原型链的作用? 组成的一个...

  • 关于JS中的原型和原型链

    目录 关于js 对象和原型 原型链 基于原型链的继承 参考资料ECMAScript 6 入门JavaScript原...

  • js_继承及原型链等(四)

    js_继承及原型链等(三) 1. 继承 依赖于原型链来完成的继承 发生在对象与对象之间 原型链,如下: ==原型链...

  • JavaScript原型链

    js原型链 原型链是JS面向对象的基础非常重要 所有对象只有__proto__属性,而函数具有prototype属...

网友评论

    本文标题:重学JS(十四)—— 一直被忽略的原型链

    本文链接:https://www.haomeiwen.com/subject/bpixvftx.html