1.什么是原型?
一个原型类似其他语言中的一个类,它定义的属性且可以被此类产生的所有对象所共享。然后它又不像一个类,原型可以在运行时获得和改变。可以增加属性到原型上或者删除原型上已经存在的属性。所有的变化将立即影响由原型派生的对象。
2.它是如何工作的呢?
js是一种动态的语言,它不是在编译期间去搜索属性值,而是在执行请求期间去搜索属性值。
例如:A的原型继承自B的原型,a对象是由A的原型派生出的对象.如果对象a上的一个属性被请求,则js表现出如下搜索过程:
a.js首先检查a对象上是否存在此属性,如果没有搜索到,则进行第b部分搜索过程。
b.js访问A的原型检查是否有此属性,如果仍然没搜到,则进行第c部分搜索过程。
c. js最后访问B的原型检查是否有此属性.
如果没有搜到将访问每个对象上的原型直到达到根原型上。这样的一个搜索过程称原型链
3.优点:
原型式继承的主要优点就是共享方法和属性,使得从原型对象中继承出来的子对象都可以在内存中共享全部的方法和属性,这如果是在大型的继承链中将会大大的改善性能和减少内存的使用量。
4.js技巧:
方式1:function f(){
this.name="xxx"
}
方式2:function f(){
}
f.prototype.name="xxx";
对于以上2种方式定义,如果var f1 = new f() 虽然alert(f1.name)效果一样,但是对于方式1,由f产生的对象每个上面都有name属性,即每个对象都有一份内存使用,如果函数f内定义的属性更多那么占用的内存可想而知非常大;对于方式2,由f产生的对象每个上面都没有name属性,搜索属性时会按照上文搜索过程最终找到"xxx";所以方式2更加优化。
5.js的继承:
function father(){
}
function sun(){
}
sun.prototype=new father();//这样子类产生的对象都会有父类中的属性,子类的构造函数变成父类的
sun.prototype.constructor=sun();//子类的构造函数还需还原回来
这样就完成了继承。