通常咱们看到prototype就会下意识的说这不就是原型对象嘛?可是大家真的了解prototype嘛?就当大家很了解了,毕竟是基础知识,我就简单说说函数
先说说工厂模式的由来吧,建立对象咱们一般能够用new Object()或者直接对象字面量{}建立,可是要是对象之间又有其余共用的代码块又将如何呢?不错,这会形成大量的代码冗余,由于在JS的世界里没有接口的概念(ES5以前),咱们平时在JS所说的类也并不是实际意义上的类,不少类的特性JS都没有,我通常就把JS的类称为一个"另类",虽然ES6有了所谓的接口,可是万变不离其宗。扯得有点远啊,既然普通建立对象会形成冗余,那怎么避免呢?起初用的是工厂模式,如demo1所示:this
function demo1 () { this.name = 'mirok', this.show = show } function demo2 () { this.name = 'july', this.show = show } function show () { console.log(this.name) } var name = 'global' new demo1().show() //mirok new demo2().show() // july show() //global
虽然demo1解决了问题,可是这样写没有任何封装而言, show函数并非引用类型特定能访问的,如demo1输出了global同样,为了解决此类问题,便有了原型模式,也就是大家常常用的prototypeprototype
function Demo2 () { } Demo2.prototype.show = function() { console.log(this.name) } var obj1 = new Demo2() var obj2 = new Demo2() obj1.name = 'mirok' obj2.name = 'july' obj1.show() //mirok obj2.show() // july
网上有不少解释了__proto__和prototype的区别,还各自写了例子,虽说了不少,也是解释得不清不楚。咱们知道建立了一个函数就带了一个prototype属性,建立一个实例就带着一个[[prototype]]指针,这个指针是实例和构造函数的原型对象间的联系,这个指针在脚本中是不可见的,也就是你不能访问的,可是在Firefox、Safari 和 Chrome中,提供了__proto__来支持访问,这么一说,相信你们应该能明白吧指针