原型对象,是用来解决构造函数在创建实例的时候,防止重复执行所导致的性能的降低(这里主要指占用内存),来为服用带来方便
如果在构造函数上添加一个方法 当你每次调用这个构造函数的时候都会调用里面的方法如果用原型对象的话就不用反复调用
每个函数都有一个prototype属性,他默认指向一个object空对象(实例)原型对象
<script>
function fun(age) {
//添加一个name属性让name属性等于传过来的name参数
this.age = age
}
const a= new fun()
console.log(fun.prototype);
</script>
显性原型对象与隐性原型对象
prototype这个是显性原型对象 __proto__是隐性原型对象
注意 构造函数上有 prototype和__proto__属性而他的实例上没有prototype属性只有__proto__这个属性
function fun(age) {
//添加一个name属性让name属性等于传过来的name参数
this.age = age
}
const a= new fun()
console.log(fun.prototype);
console.log(fun.__proto__);
console.log(a.prototype);
console.log(a.__proto__);
而且他的实例上的__proto__和他的构造函数上的prototype是一样的
***其实当你调用某些方法比如像onclick事件就是它定义好的事件都是在原型上定义的 ***
原型链
看一段代码
<script>
function fun(){
this.test1=function(){
console.log("test1");
}
}
fun.prototype.test2=function(){
console.log("text2");
}
const a=new fun()
a.test1()
a.test2()
a.toString()
a.test3()
</script>
这里test和test2都能找到因为他们一个添加到构造函数上一个添加到了原型对象上
那为什么没有定义tostring和test3,tostring没报错test3确报错了因为tostring在原型链上
原型链理解
当要找一个方法时他会先在这个构造函数上面找,如果找不到就会去他的原型对象上面找如果还找不到他就回去object空实例对象(其实是实例对象的__proto__,实例的__proto__===构造函数的prototype,prototype指向objeect)上面找
这个空object空实例对象指向一个object原型对象 就相当于 object.prototype(每个函数都有prototype)它里面还有很多方法tostring就是一个如果 object.prototype再找不到就会接着去__proto__上面找而object的原型对象的__proto__是null所以就找不到test3