面向对象有三个特点,一个个来说
封装
私有变量
利用闭包实现对象的私有变量。
|
|
碰过的一个有趣的问题:
实现一个book构造函数,有一个属性id,每次调用该值加1。
运用闭包和立刻执行函数。
|
|
共有方法
看下面的代码可以发现,getAge被重复创建了
|
|
如果不想方法或者属性在每次new时新创建一份,可以将其设置在构造函数的原型prototype上。
|
|
继承
听说继承有六种方法,假设让Dog继承Animal,
,无非就是for in
复制属性,修改原型链如dog.prototype = new Animal
,直接Object.create
,在Dog中使用Animal.call
然而我们记住最好的一种就够了,就是组合继承。
先试下这样写,利用call的继承
|
|
可是如果在*1处加上这样的代码
|
|
在*3处输入
wangcai.say2()
,会报错提示不存在该方法,说明我们的继承是不完整的。dog没有继承原型链上的方法
我们需要在*2补上
|
|
这时候不会报错了,补上Object.create的polyfill
|
|
然而还有一点小漏洞,当我们查看wangcai.constructor
时,会发现指向的是Animal。因此我们需要修复一下
|
|
补充一下new的模拟
|
|
完整代码
|
|
检测继承是否成功的代码
使用Object.create()和修复Dog.prototype.constructor = Dog是不是挺多余的?es6提供了这么一个函数Object.setPrototypeOf
因此我们可以使用Object.setPrototypeOf(Dog.prototype, Animal.prototype)
替换刚刚提到的两行代码
可以了解到Object.setPrototypeOf(A,B)
相当于令A.__proto__ = B
。
个人用的实现继承的代码
|
|
多态
一个函数可以应用于不同的对象。并且根据this的不同,函数调用的结果也不同
|
|
或是在函数中检测arguments的数量和类型来实现多态
|
|