对象
外物归宗,一切皆为对象(Object)——所有东西的老祖宗都是object。我用两个不同颜色的字体来划出Object和object,前者首字母大写,后者首字母小写。为什么要这么书写呢?首先区分下“对象”和“原型”。
举例:对象=鱼,原型=生物。同时:对象=鸟,原型=生物。
可以说,鱼和鸟都是对象,也可以说他们都是生物。同样的,生物,也是一个对象(最原始的对象)。迷糊?你是人,我是人,难道我们的祖宗就不是人啊?
在JavaScript中,Object对象同等于 Function对象。他们的老祖宗都是object。Object是一个存储属性,而Function是一个执行过程。【P1】
就像鲤鱼(对象)和麻雀(对象),它们具备生物(原型)的特征:具有生命特征。但是又具备了相应对象的特征:游泳、飞翔。
请测试:
Code1
alert(typeof Object);
alert(typeof Function);
两个结果都是“function”。天啊,彻底乱了。不是说Function是object么?
在测试:
Code2
alert(typeof Object.prototype);
alert(typeof Function.prototype);
这次的结果正常了,Object的原型正是object,而Function的原型也像是我们理解的function。但是考虑下
最后来一个测试:
Code3
alert(Object);
alert(Function)
结果:function Object()...和function Function().... 。和原型一样。
想必所有的读者都已经彻底不知道我在做什么了。说心里话,我在对这些进行测试的时候也是茫然万分。直到……
Code4
function object()
{
this.prototype = something;
this.constructor = something;
this.toString();
this.valueOf();
}
function Object(){ }
Object.prototype = new object();
function Function(){ }
Function.prototype = new object();
function String(){ }
String.prototype = new Object();
function Number(){ }
Number.prototype = new Object();
and so forth............
不管你看得懂开始看不懂,都不重要,这一篇文章千万别深入理解,感觉可以明悟一丝丝便可,否则你将会越来越迷糊。重要的是,你要理解对象与祖宗。JavaScript不是那么容易的。当然也极有可能是笔者的理解错误,如带来不便,敬请见谅!包括之后相关系列的文章均为如此!
【p1】如果你觉得分不清:object、 Object和Function,请一定要尝试以下代码,并告诉自己object代表的是本机代码(祖宗),所以我们无法声明、使用object。
Code5
Function.prototype.read = function(){};
for(var i in Function)
alert(i)
Object.prototype.write = function(){};
for(var i in Object)
alert(i)
alert(Object.prototype.isPrototypeOf(Object.prototype)); // true
alert(Object.prototype.isPrototypeOf(Person.prototype)); // true