无废话JavaScript教程(全集)第2/4页

 更新时间:2008年10月07日 23:28:35   作者:  
许多读者认为我那本《JavaScript语言精髓与编程实践》读来辛苦,所以我一直想写个简单的读本。索性,这次就写个最简单的吧。

那么JavaScript当然……必然……可以面无愧色地支持直接量了——他们其实是一个概念。例如:
// in javascript
var
aByte = 256
只不过在理解的时候,一定要切记:所有上述的代码中,所谓直接量或立即值,是指那个'256',而不是那
个变量或常量的标识符ABYTE/aByte。更进一步的,你要知道JavaScript支持了8种直接量声明:
--------------------
数值:支持整数,浮点和0x等进制前缀,以及……等等;
布尔值:true/false;
无值:undefined;
函数:function() { ... },也称为匿名函数;
字符串:使用'..'或"..",支持多行和转义符;
正则表达式:使用/../..,支持g,i,m等正则配置;
数组:使用[..],支持嵌套数组;
对象:使用{...},支持嵌套对象声明;
--------------------
你可以把上述字符量作为一个个体,用在代码——我的意思是表达式或语句行——的任意位置。用鼻子就可以
进行的推论是:
//既然可以写:
aaa = 'hello, ' + 'world';
//那么就必然可以写:
bbb = [1,2,3] + [4,5,6];
//同样也就必然可以写:
ccc = /abc/ + /cdf/
//同样:
// ……
如上的,你可以把所有的直接量放在表达式或语句中间。偶尔的,因为语法解析的必要,你可能需要用一对
括号把这个直接量括起来——否则语法上会出现歧义,例如下面这个:
ddd = (function() {}) + (function() {})
好了,直接量原本就这么简单,你只需要期望自己还有一个没退化的鼻子就好了。
四、原型继承
原型继承可能是这个世界上最简单不过的东西了。
我们假定一个对象是一张表——伟大的Anders就支持我这个假设,他说JavaScript的对象是“属性包”——
这样的一个表中存放的就是“name=value”这样的“名字/值”对。当我们想用下面的代码:
aObj.name
去找值(value)时,就在表里查一下(用delphi的人应该记得TStringList吧)。对象,哦,所谓对象——在
我曾经的理解里——就是“带有继承关系的结构体(struct/record)”。那么,继承关系是?
是这样,如果上面的查找不成功,对于原型继承来说,只需要在aObj这个对象的“原型”中找一下,就成了。
这个原型也是一个对象,记录在构造器函数的prototype属性中。例如:
function MyObject() {
// ...
}
MyObject.prototype = xxx;
var aObj = new MyObject()
zzz = aObj.name;
当在aObj中找不到name这个属性时,按照上面的规则,就会去xxx这个对象中找,也就是试图找找"xxx.name"。
由于xxx本身也是一个对象,也会有一个构造器函数(例如xxxObject()),因此当xxx.name也找不到时,就会
去xxxObject.prototype里面去找……如此……如此深层次的挖掘,直到再也找不到……就返回undefined。
多简单啊,所谓原型继承,只不过是一个简单的检索规则。
反过来说,你需要让aObj能访问到某个成员,也只需要修改一下它(或它们——一指类似aObj的实例)的原型
就好了。这在JavaScript中是非常常用的。例如你想让所有的string都有某个属性:
String.protoype.MyName = 'string'
又例如你想让所有的对象都有某个属性(或方法,或其它什么东东),那么:
Object.prototype.getMyName = function() {
return this.MyName;
}
多么美好,现在String也能getMyName了,函数也能getMyName了,所有没有名字的也有名字了——当然,名
字是undefined。
没名字也是名字,我没想过你会不会变成哲学疯子,对不起。

相关文章

最新评论