首先,先看一段简单的js代码:
function Fun() {
this.num = 10;
};
var fun = new Fun;
var func = new Fun;
console.log("Fun:", Fun);
console.log("fun:", fun);
console.log("func:", func);
我定义了一个Fun(),(js中,一个function,有三个身份:函数,类,对象)。我把Fun()当做一个类,定义了fun和func对象。来看看执行结果吧:
以上Fun显示有prototype成员,而fun和func对象没有prototype成员。所以,得出结论:只有类(函数)才有prototype成员,这个成员被称为“原型对象”,它指向一个空间,成为“原型空间”。
以上结果还显示出:fun和func有num成员,但Fun没有。这一点和var fun = new Fun和var fun = new Fun的执行过程有关,过程如下:
1、申请一个对象实例空间。
2、将空间首地址赋值给对象fun和func。
3、执行Fun的构造方法,这个构造方法,就是函数本身。
4、这个构造方法在执行的时候,是有前缀的(有对象调用此构造方法),这个对象,就是fun和func。
所以,函数Fun中的this就是fun或func,所以,fun和func显示有num成员。
console.log("Fun.prototype:", Fun.prototype);
以上代码和结果显示,类的原型本身也是对象(Object),那么,既然是对象,就可以增加成员。
Fun.prototype.mem = "这是Fun.prototype的一个成员";
console.log("Fun.prototype:", Fun.prototype);
console.log("fun.prototype:", fun.prototype);
以上代码和结果显示:给Fun.prototype增加一个成员mem。Fun.prototype显示有mem成员,而fun.prototype显示的是undefined。所以,这个说明对象不存在prototype成员,这是检验对象是否是函数的一种判断方法。(Fun是函数,类,对象;fun和func是对象)。