1、继承
继承可以使得子类具有父类别的各种属性和方法,而不需要再次编写相同的代码。
__proto__和prototype的联系与区别
__proto__是JavaScript中对象实例所拥有的一个属性,它指向的是该对象实例所对应的prototype对象。(需要注意的是,如上所述,Object.prototype是所有对象继承的顶点,而它的__proto__的值为null)
__proto__与prototype的区别则在于,__proto__是对象固有的属性,它指向的是该对象实例的构造函数的prototype(Object.prototype除外),而prototype是函数固有的属性,其值是一个函数的原型对象。对象的__proto__指向构造函数的prototype。
只有构造函数才有prototype,prototype只有一个功能就是用来存放共有属性对象的地址。
ES5 实现继承的方式就是加原型链:
等价于:
var f = function(){}
f.prototype = Human.prototype
Man.prototype = new f()
原理:New 会间接强行让其相等;
具体为:
var obj = new Fn ()
(1)产生一个空对象;(2)this = 空对象;
(3)this.__proto__ = Fn.prototype
(4)执行Fn.call(this,arguments...)
(5)return (4)的结果
如果直接Man.prototype = new Human(),但是new会让第四部分执行的结果绑定到this.__proto__上,因此
var f = function(){}
f.prototype = Human.prototype
是必要的,将Human这个构造函数内的proto清空。
改原型链是十分损耗性能的。
ES6 写法
2、mixin、柯里化等常见术语
mixin 混入
curry 柯里化
将一个函数的多个自变量或者多个函数,其中的部分自变量或者部分函数固定,得到新的偏函数,这个过程叫作柯里化。
HOC 高阶函数