Prototypes
Objects are build by ‘constructor calls’(via: new)
A “constructor call” makes an object it is own prototype.
(cs101:
什么是类,对一个事物的抽像描述: 属性和方法.这个东西有啥属性, 能做什么。
类和实例的关系: 实例是类的实现。
类的一些特性: 继承和多态。
)
A “constructor call” makes an object linked to its own prototype.
注意区分link(保存引用)和完全复制的区别.js为了性能, 并没有进行完全复制。
所以, js中的class的继承并不是copy而是link, 链接万物。当然,你需要完全copy也不是不可以.
Prototypal class
1 | function Workshop (teacher) { |
Dunder Prototypes
1 | function Workshop (teacher) { |
Object.setPrototypeOf
正常的函数有prototype, 箭头函数没有.
shadowing prototype
原型链重写会导致很多问题, 导致指向异常。
prototypal inhertance
原型链继承并不是复制, 而是引用。
js中的继承其实更像行为委托(代理).
class并不是唯一解,但是对于一些框架来说,class也许是他们的选择。原型模式对我们来说或许更加的适用。
OLOO Pattern (Object linked to other objects)
recall class
1 | class workshop { |
OLOO
1 | const workshop = { |
ES5 polyfill: Object.create
1 | if(!Object.create) { |
delegation: design pattern
其实class只是实现相同结构的一条路。我们通过组合, 可以达到和class相同的效果,并且由于js的只引用不复制的一个语言特性下, 我们使用组合或许更加符合js的语言特性.
class的一个思想趋势是, 区分父子关系然后链接。而组合则是点对点的关系。那么组合的层级还有方式就很多。可以说组合让代码的粒度更细了。
还有个好处是,this的指向在组合的设计模式下会更加清晰。因为调用关系明确。判断this指向的四个规则第一条就是, 谁调用, 指向谁。