js原型空间

类(函数)拥有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中的继承是否可以用原型空间解决,答案是肯定的,小编会在后续博客中讲解。
最后上图:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值