-
Notifications
You must be signed in to change notification settings - Fork 4
Innovations
goto100 edited this page Jul 22, 2013
·
3 revisions
- js oop 解决方案很多,但基本都是随着某一流行的库一起发布,没有独立版本,各个库的方案也不兼容,如 Mootools、Ext、dojo 等;
- 只解决语言层面的问题,不包含上层绑定,为上层绑定提供了很多功能,应用场景广泛;
- 个人认为,在 js 的学习曲线中,原型继承是 js 中最晦涩难懂的部分,一个写了几年 js 的程序员如都可能没有掌握;
- oop.js 实现继承的原理依然是传统的原型继承;
- oop.js 对原型继承做了全面的封装,在正常使用情况下不会出现
prototype
关键字;
- 提高开发体验,降低维护成本;
- 在 oop.js 中所有涉及到命名的东西都是一次定义,保持代码整洁;
- 在定义类时只出现一次类名;
- 在调用父类同名方法时不用书写同名方法;
- 方法可以获得到自己的名字,为上层代码提供了命名一次定义的灵活性(比如自动fire同名事件);
- 和 loader 结合后,类也可以获得自己的名字;
- oop.js 广泛应用描述器形式做成员定义,
property
、classmethod
、staticmethod
;
- 没有任何原型污染(反例 Mootools);
- oop.js 尽量避免对你的类产生过多可能造成冲突的成员污染,唯一暴露的普通命名成员是
get
和set
(kissy RichBase 有很多); - 必要的成员会用前后双下划线存储(base、mixins、metaclass),因为是语言级别的解决方案,同 js 语言中的内置成员(
__proto__
、__noSuchMethod__
)等命名方式相同;
- oop.js 中不存在单独的类方法或实例方法,所有方法定义后都可以在类和实例上调用,区别是调用传递参数的不同;
- 模仿 python;
- 此设计也是为了隐藏
prototype
关键字而做的; - 可以通过 metaclass 关闭此特性;
- 降低维护成本;
- oop.js 通过实例方法的第一个参数
self
传递实例的引用,this
关键字在 oop.js 中被赋予了其他意义; - 目的是避免
var self = this
带来的脏代码和维护成本的升高; - 在 node 平台下测试,所有实例方法嵌套会带来一个比较稳定的性能损耗;
- 可以通过 metaclass 关闭此特性;