类(函数)拥有prototype成员,这个成员被称为“原型对象”,它是实际存在的空间。
function Fun() {
};
var fun = new Fun;
var func = new Fun;
其中Fun函数是方法,也是类,fun和func为Fun类实例出来的对象.。我们看一下他们分别是什么。
我们发现fun和func的prototype成员与Fun函数的prototype是完全相同的。
得到两个结论。
1.对象里的prototype是指向类原型空间的指针。
2.原型空间默认有constructor和prototype成员,通过观察,constructor就是Fun函数本身。
接下来,我们查看函数prototype和对象prototype是什么。
console.log("Fun.prototype:", Fun.prototype);
console.log("fun.prototype:", fun.prototype);
console.log("func.prototype",func.prototype);
很清楚的看到了对象是没有prototype属性的,而Fun的prototype是对象,但在刚刚我们看到了对象是有prototype属性的,这是因为我们调用方式不对,如下:
console.log("fun.__proto__:", fun.__proto__);
console.log("func.__proto__:", func.__proto__);
我们得到了,说明对象具有隐形成员__proto__指向类的原型空间.
接下来我们看一下构造函数和原型空间的关系
通过观察,得出结论,原型空间的constructor指向构造函数,构造函数的prototype指向了原型对象。
首先我们已经知道了类的原型空间被对象的__proto__属性所指向,那我们测试一下修改类的原型空间对象是否对对象有所影响
Fun.prototype.member = "这是prototype的一个成员";
fun.member="fun的member成员"
console.log("fun.member:", fun.member);
console.log("func.member:", func.member);
我们明显的看到了一些问题,首先我们没有对func添加属性member,而是对Fun的原型成员添加了这个属性。
得出结论:fun对象现在自己的键值对空间查找member,有,输出;没有,去Fun的原型空间里面去找。
func.__proto__.member = 100;
console.log("fun.member:", fun.member);
console.log("func.member:", func.member);
console.log("Fun:", Fun);
得出结论,对象可以在类的原型空间里添加属性,这个属性作用于所有该类对象。
func.__proto__.member = 100;
console.log("fun.member:", fun.member);
console.log("func.member:", func.member);
console.log("Fun:", Fun);
console.log("Fun.prototype.member:", Fun.prototype.member);
console.log("Fun.member:", Fun.member);
上面一样的,我们增加看一下这个member是否能被Fun类所识别,换句话说就是类能不能获取到原型空间的属性。
很遗憾,类无法识别到类原型空间的属性。
我们来看一下类对成员的影响。
function Fun() {
this.newMessage="new Message";
};
function Fun1(){
Fun1.newMessage="类的成员";
};
var fun = new Fun;
var func = new Fun;
var fun1 = new Fun1();
var func1 = new Fun1();
//console.log(window);
console.log("Fun:", Fun);
console.log("Fun1:", Fun1);
console.log("fun:", fun);
console.log("func:", func);
console.log("fun1:", fun1);
console.log("func1:", func1);
我们发现this关键字对类毫无作用,而类的对象却都得到了这个属性,所以得出结论,this是指向实现对象的指针。
类的newMeassage属性,对象好似无法得到的。
我们前面知道了对象的原型空间指针指向类的原型空间,那么不由的思考一下,类的prototype是指到哪里去了。
得出结论:function xxx(){}出来的不仅仅是类或函数,还是对象,它的__ptototype__指向Object类的原型空间,这就令我们不经想到,js中的继承是否可以用原型空间解决,答案是肯定的,小编会在后续博客中讲解。
最后上图: