每个函数创建后,解析器都会向函数中添加一个属性prototype
这个属性对应一个对象,这个对象就是我们所谓的原型的对象
如果函数作为普通函数调用则prototype无意义
如果函数以构造函数形式调用,它所创建的对象中都会有个隐藏的属性
指向该构造函数的原型对象,我们可以通过__proto__来访问该属性
原型对象就相当于一个公共区域,所有同一类的实例都可以访问到这个原型对象
我们可以将对象共有的内容,统一设置到原型对象
function Myclass(){}
//向原型对象中添加属性 Myclass.prototype指向一个原型对象
Myclass.prototype.a=123;
Myclass.prototype.b=4567;
Myclass.prototype.sayHolle=function(){
alert("Hello")
}
var mc =new Myclass();
//如果mc中没有a这个属性,则会找到原型对象中是否有a这个属性
alert(mc.a);
mc.a=456;
alert(mc.a);
mc.sayHolle();
mc.age=18;
//检查Myclass中是否有a属性
alert("b" in Myclass);//true 自己里面没有,他会跑到原型中去检查
//检查自己对象有没有该属性可以用一下函数检查
alert( "age:"+mc.hasOwnProperty("age"));
我们定义了一个函数Myclass然后通过prototype属性给原型对象添加属性。
new了一个构造函数mc此时mc中有个属性叫__proto__,这个属性存的值和Myclass.prototype一样,都是指向同一原型对象,所有。只要是同一个对象,不管你new了多少个,他们__proto__都是指向同一个原型对象。所有
我们可以将对象共有的内容,统一设置到原型对象
好了,放一个图 方便理解
接下来我们来说一下原型链
alert(mc.__proto__.__proto__.hasOwnProperty("hasOwnProperty"));
我们要想知道hasOwnProperty在哪,就可以一层一层往下找。
原型链
原型对象也是对象,是对象就有原型,当我们使用对象属性或方法时,会先在自身寻找,自身如果有,则直接使用
如果没有则取原型对象寻找,如果原型对象中有,则使用,如果没有,则去原型的原型寻找,直到找到Object对象原型,Objcet对象没有原型,如果Objcet依然没找到,则返回undefined**====原型链**