前端设计模式之依赖倒置原则(DIP)

前端原型的个人猜想

  相信每个学习javaScript的同僚,一定对一个说法非常熟悉『一切皆对象』.

  这个说法很好的将我们从现实社会连接进了程序世界,同时也解释了程序界很多古怪无法理解的东西.

  而事实真是这样么?在我写了这么久代码之后,我反而对javaScript最基本的东西产生了越发的迷茫和混乱.

  像隐式转换、原型链的继承这种更是完全无法想通,当我看到null和undefined时鬼知道我的脑子会爆炸出什么,最后扭合到一起,变成一堆的问号…

  现在我希望彻底能搞清祖师爷在创造javaScript是究竟是怎样的思路,这对我来说很难,但我知道当我搞清楚这个问题时,会有一个很大的飞跃,我不应该继续『不了解但不影响工作』在的舒适区混下去.

  感谢jQuery的源码,让我有了共享原型的概念,不然我一定会强制要求原型链必须是个有唯一顶点的树状结构。

  *请注意下面代码中,一定要将Object.prototype和Function.prototype当成是独立的一部分

1
Object.prototype.__proto__ == null   // true

  这里我们知道了Object.prototype的原型链向上指向是null,注意我没有说它继承自null,因为null是个很特别的类型,我们都知道原型的本质是个对象,所以它应该继承自对象.
  那这里怎么会是个null呢?我是猜想浏览器帮我们指向了null.
  太好了,至少有一个封闭的点了!我们继续.

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

  大声尖叫,Object竟然继承自Function.prototype,『一切皆对象』并不是最后的真像!就好比我们好不容易发现了真菌细菌这些肉眼看不见的小东西,转眼我们又发现了分子原子,难道大世界无限的在嵌套我们不知道的小世界么?

  好在程序世界的构成元素就是这几个,根本不存在宇宙这种无休无止的构成一说,但程序世界与现实世界还有一个最大的区别,叫做『自举』,这里我们可以简单理解为『我可以创造我自己』.

  有了上面代码,就下面代码的成立.

1
Object instanceof Function == true

  但是我们还知道

1
Object instanceof Object == true

  这里是『我创造了我自己』么?不是的,这里完全是多绕了一步

1
2
Object.__proto__ == Function.prototype   // true
Function.prototype.__proto__ == Object.prototype // true

  目前还没有出现Object,我们又回到了Object.prototype,而Object.prototype.proto等于null这件事我们在第一步就已经证实过了.

  问题出在哪呢?当然还是Object.prototype的继承问题!刚刚说过了Object.prototype很有可能是Object的实例,并保留了其继承关系,而浏览器对其赋值为null.

  这完全出自我的个人想法,因为如果不是这样,这条原型链的解释则都不成立.

  再看这个

1
Function.__proto__ == Function.prototype  // true

  Function继承自自己

/* 这里非常明确了Object继承自Function.prototype */


/*我们知道了上面代码的关系 下面这句就理所当然了*/


/* 但我们还知道*/