一.prototype
一般函数会预设prototype属性,这个属性是一个对象。
function Foo(){
this.y=2
}
typeof Foo.prototype;//object
Foo.protype.x=1
var obj3=new Foo();//创建一个实例,函数作为构造器使用,this将指向一个对象,对象的原型将指向构造器的prototype属性。
obj3.y;//2
obj3.x;//1
Foo.prototype对象内部结构
{
constructor:Foo,
__proto__:Object.prototype,
//原型,指向object.prototype,因此object的方法才能被拿来直接使用
x:1
}
二.prototype与原型的不同
函数的prototype对象属性的作用是当使用new方法构造实例的时候,构造器的prototype属性会用作new出来的对象的原型。prototype是函数中预设的对象属性,而原型是对象上的原型。
三.原型链实现继承
function Person(name,age){
this.name=name;
this.age=age;//通过new创建对象时,this指向原型为Person.prototype的空对象,然后通过this.name来给其赋值。
Person.prototype.hi=function(){
console.log("hi"+this.name)
}//通过这种方式创建所有实例共享的方法。
function Student(name,age,className){
Person.call(this,name,age);
this.className=className;
}
Student.prototype=Object.create(Person.prototype);//创建一个空对象,该对象的原型指向它的参数。不能用Student.prototype=Object.prototype的原因:当我们想增加一些student自己的变量会出错。
Student.prototype.constructor=Student;//不设置的话,constructor会指向person
}
同名方法,Student方法会覆盖Person方法。
四.动态改变prototype
Student.prototype.x=101//当动态的添加一个x的属性,所有已经创建的对象中都会新增一个x属性。
Student.prototype={y:2};//直接修改,赋值为一个新对象,赋值后,结果如下:
bosn.y;//undefined
bosn.x;//101//已经实例化的bosn并不会被影响。
var nunnly=new Student("Nunnly");
nunnly.x;//undefined
nummly.y;//2//新创建的对象会受到影响。
五.instanceof
[1,2]instanceof Array===true//左侧要求是一个对象,右侧要求是一个函数。该函数将会判断右侧的prototype属性是否出现在左边对象的原型链上。
不同的window或者iframe间的对象检测不能使用instanceof