我们先来了解一下,js使用原型对象的作用是什么?
回答:在使用自定义构造函数创建对象情况下,在实例化多个对象时,可能有很多方法或者属性相同,比如一个人的对象构造函数,那么人都有会跑的方法一样,都有10个拇指等等属性,这个人对象的方法,你实例方法的时候都得一一创建内存空间,这样太耗资源,那么就需要一个共享空间,共享库来装,那么这样实例化的时候,相同的内容就不用浪费内存空间了,在后面继承的时候,你的父类原型对象没有整这个方法,还可以通过原型链继承祖先的内容使用到。
好,下面通过代码来试一试
<script>
function Person(){
}
Person.prototype.muzhi=10;
Person.prototype.run=function(){
console.log("我们都会跑");
}
var p1=new Person();
console.log(p1);
console.log(p1.muzhi);
p1.run();
var p2=new Person();
console.log(p2);
console.log(p2.muzhi);
p2.run();
</script>
这个效果是什么呢,请看
那么我们看出来这样节省了内存空间,都说原型对象,是啥意思,没看到对象呢?
原来为每个构造函数专门设置了一个原型对象,用来存取一些共享属性,并且可以构成原型链。
我们的拇指和run方法都是在这个构造函数的原型对象上面进行增加的,那么可以用一个别的独享,替换这个原型对象吗?答案是可以的。空口无凭,下面我们上代码,验证一下
通过对象的形式设置原型对象(共享库)的属性和方法,效果一样的,这样也证明了对象被修改了
function Person(){
}
Person.prototype={
muzhi:10,
run:function(){
console.log("我们都会跑")
}
}
有人会问:哪里证明原型对象可以更改,首先原型对象我们要怎么获取,有以下两种
1.Person.prototyte,这就可以明白为什么上面让他等于对象就替代了的原因。
2.p.__proto__(__proto__在实际中一般不适用,因为作用是在方便调试产生的)。
下面我们通过一张图来了解一下实例对象,构造函数,原型对象,看完在反复读这篇博客,你就懂了。
图片看了,还不清楚,我们来一一打印一下
function Person(){
}
Person.prototype={
muzhi:10,
run:function(){
console.log("我们都会跑")
}
}
var p1=new Person();
这下一目了然了吧,原型里面还有原型链的存在,也就是下节博客的内容。