这两天读了网上的一些文章,今天稍微整理一下关于这个问题的多个角度。
1. Object Instantiation
// 基础,不多解释了
var People = function People(firstName,lastName) { this.firstName = firstName; this.lastName = lastName; this.getName = function() { return this.lastName+” “+this.firstName; // chinese way } } |
2. Prototype Inheritence
// 常规写法
, 当然还有些其他写法, 例如参考2里的Object.create, 但是本质是一样的啦 var Employee = function Employee(firstName, lastName, salary) { People.call(this,firstName,lastName); this.salary = salary; } |
3. Encapsulation(Public/Private)
OO面向对象的特性之一,封装,javascript的也能搞定,不酷,甚至有点恶心
Public
function Constructor(…) { this.membername = value; } Constructor.prototype.membername = value; Private function Constructor(…) { var that = this; var membername = value; function membername(…) {…} } Note: The function statement function membername(…) {…} is shorthand for var membername = function membername(…) {…}; Privileged function Constructor(…) { this.membername = function (…) {…}; } |
4. Namespace
学习java的名称空间,javascript里一直没有标准的做法,从功能上当然是可行的
var myNamespace = {
foo: function() { }, bar: function() { } }; myNamespace.foo(); |
下面这段是从《JavaScript DOM 高级程序设计》中摘的,貌似更高级一点
(function() {
// 通过 ID 获取 Element 对象 function $(id) { return document.getElementById(id); } // 显示对应 ID 的对象的节点类型名字 function myMethod(id) { alert($(id).nodeName); } // 这是对外的接口 window[‘myNamespace’]= {} window[‘myNameSpace’][‘$’] = $; })(); |
5. Module (commonJS)
javascript越来越流行,从前几年的AJAX,到现在的nodeJS,前端MVC等等,
腾讯做的WebQQ也是这一范畴,或者还有360桌面,网页和App的界限越来越模糊,
甚至有完全基于浏览器的ChromOS的硬件
这些都说明,javascript天降大任,虽然javascript先天发育得不好。。。
commonJS其实是个规范,而nodeJS是这个规范的实现之一,它的目标是做一个javascript标准库(就像JDK,ruby Gem一样),借助javascript引擎(eg: V8),使得javascript也能处理更多的应用场景,学习其他语言成熟的模块化当然是可行的。
当然,自己实现javascript模块的时候,从逻辑上和物理上区分也是不错的实践方法。
6. Module load (requireJS)
javscript的库其实很多,有非常成功的jQuery,prototype,YUI等等,由于global对象的关系,不同的库存在对象的冲突,
这时候就需要模块加载机制,管理很多js文件,避免冲突等等,requireJS是用的比较多的一个加载库,google其实也有。