接着上一篇文章写的...
一.对象原型_proto_
为什么实例化对象可以使用构造方法的原型对象的方法呢?
答:因为对象都会有一个属性_proto_,指向构造函数的prototype原型对象。
_proto_对象原型和原型对象prototype是等价的.
_proto_对象原型的意义在于为对象的查找机制提供一个方向,或者说一条路线。
方法的查找规则:首先看ldh对象身上是否有sing方法,如果有就执行这个对象上的sing方法
如果没有,因为有_proto_的存在,就去构造函数原型对象prototype身上查找sing这个方法。
二.构造函数 constructor
对象原型和构造函数原型对象里面都有一个属性constructor,constructor我们称为构造函数,因为它指回构造函数本身。
<script>
function Star(name,age){
this.name=name;
this.age=age;
}
Star.prototype.sing=function(){
console.log("我会唱歌");
}
console.log(Star.prototype);
console.log(ldh.__proto__);
</script>
很多时候我们需要手动的利用constructor这个属性指回原来的构造函数
比如
Star.prototype={
sing:function(){
console.log("我会唱歌");
}
}
var ldh=new Star("ldh",50);
console.log(Star.prototype.constructor);
console.log(ldh.__proto__.constructor);
这是因为新添加的对象把原来的构造函数原型对象给覆盖掉了,所以没有construct对象了
所以需要手动添加一个属性,重新指回原来的构造函数
Star.prototype={
constructor:Star,
sing:function(){
console.log("我会唱歌");
}
}
结论:如果我们修改了原来的构造对象,给原型对象赋值的是一个对象,则必须手动的利用constructor指回原来的构造函数。