zz Dojo Javascript 编程规范
前言
相当不错的 Javascript 编程风格规范,建议大家采用此规范编写 Javascript。原文链接: http://dojotoolkit.org/developer/StyleGuide 。
翻译(Translated by):i.feelinglucky{at}gmail.com from http://www.gracecode.com ,转载请注明出处、作者和翻译者,谢谢配合。
本文地址: http://code.google.com/p/grace/wiki/DojoStyle 。
序
Any violation to this guide is allowed if it enhances readability.
所有的代码都要变成可供他人容易阅读的。
快读参考
核心 API 请使用下面的风格:
| 结构 | 规则 | 注释 |
| 模块 | 小写 | 不要使用多重语义(Never multiple words) |
| 类 | 骆驼 | |
| 公有方法 | 混合 | 其他的外部调用也可以使用 lower_case(),这样的风格 |
| 公有变量 | 混合 | |
| 常量 | 骆驼 或 大写 |
下面的虽然不是必要的,但建议使用:
| 结构 | 规则 |
| 私有方法 | 混合,例子:_mixedCase |
| 私有变量 | 混合,例子:_mixedCase |
| 方法(method)参数 | 混合,例子:_mixedCase, mixedCase |
| 本地(local)变量 | 混合,例子:_mixedCase, mixedCase |
JavaScript散记
跨浏览器通信
建立跨浏览器通信有两个前提条件
- 两个窗口都包含来自同一个域的页面;
- 其中一个窗口包含对另一个窗口的引用。
第一个条件是JavaScript同源策略的结果,保护用户的隐私,第二个条件是为了使一个窗口知道另一个窗口的存在。实现通信主要是涉及到window对象的name和opener属性,以及open()方法。
window.name属性的作用是为HTML链接的target属性作引导的,同时它也可以引导弹出窗口。它的默认值为空,但可以设置的。
window.name = "endlesscode";
点击带有此target的链接,比如<a href="somepage.html" target="endlesscode">,该链接就会在window.name为"endlesscode"的窗口打开。另外,也可以在window.open()方法中使用name,例如:
window.open("somepage.html", "endlesscode", [arguments]);
这样浏览器就会查找名字叫做"endlesscode"的窗口。如果它找到一个,somepage.html就会在这个窗口打开。如果没有找到,就找开一个新窗口,并将name命名为"endlesscode"。其实像wp的预览、优酷的视频观看页面以及卓越的书目录页面都是使用这种方式在同一个页面打开的。
window.opener属性是弹出窗口指回主窗口的引用,如果新页面被载入到弹出窗口中(如果用户点击了一个链接),opener属性仍旧可用。如果新页面是载入到主窗口中,则可以通过在弹出窗口中
opener.ST_newWindow = window;
来在主窗口中保存弹出窗口的引用。
JavaScript中的一些定位属性

有这张图就够了,简单地说明一下
以Height为例,Width同理:
- div.clientHeight:可见窗口除去了margin+border之后的长度。
- div.offsetHeight:在div.clientHeight的基础上加了border和滚动条的长度。
- div.scrollHeight:就是元素内容的实际高度。
JavaScript中Function和Object的关系

- Function.__proto__指向Function.prototype,这导致:
Function.constructor === Function Function instanceof Function == true
即Function是它自己的构造器。
- Object.__proto__指向Function.prototype,即Object也是Function构造的实例,因此有:
Object instanceof Function == true
同时也等价于:
Object.constructor === Function
而Function.prototype.__proto__又是指向Object.prototype,即Function.prototype是Object构造的实例,因此有:
Function instanceof Object == true Object instanceof Object == true
- Foo.__proto__指向了Function.prototype,可以看到自定义的函数Foo其实就是Function的一个实例:
Foo instanceof Function == true
参考:
浅析JavaScript的原型链
原型的含义是指:如果构造器有个原型对象A,则由该构造器创建的实例(Object Instance)都必然复制于A。““在JavaScript中,对象实例(Object Instance)并没有原型,而构造器(Constructor)有原型,属性'<构造器>.prototype'指向原型。对象只有“构造自某个原型”的问题,并不存在“持有(或拥有)某个原型”的问题。””如何理解这一句话?
代码1:
function myFunc() {
var name = "stephenchan";
var age = 23;
function code() {
alert("Hello World!");
};
}
var obj = new myFunc();
//输出undefined,对象实例没有原型
alert(obj.prototype);
//输出myFunc的函数代码,obj由myFunc构造出来的
alert(obj.constructor);
//输出true
alert(obj.constructor == myFunc);
//输出[object Object],说明myFunc的原型是一个对象
alert(myFunc.prototype);
//输出function Function() { [native code] },[native code]的意思是JavaScript引擎的内置函数
alert(myFunc.constructor);
//输出true,函数原型的构造器默认是该函数
alert(myFunc.prototype.constructor == myFunc);
构造器与函数的概念是一致的,即代码1中,myFunc就是一个构造器,因为通过new myFunc()就可以构造出一个对象实例了。因此,"alert(obj.prototype)"输出undefined说明了对象实例是没有原型的,"alert(myFunc.prototype)"输出[object Object]说明了构造器有原型,而“obj.constructor==myFunc"返回true说明obj的构造器是myFunc。