如何理解prototype ?
对象是由构造函数构造出来的。
由同一个构造函数构造出来的对象,如果这些对象有相同的属性,方法。
1.每一个对象都保留一份这些属性,方法的副本。浪费内存。
2.重构:将相同的属性功能提取到父类中去。这里将这些共同的属性方法保存在一个单独的对象中,
每个新建的对象用一个指针指向这个共同的对象。
3.构造函数中用prototype指向这个共享的公共对象。
4.使用的new运算符,相当于干了以下工作:
var f1 = {};
f1.__proto__ = fun.prototype;
fun.call(f1);
new 一个对象时,将prototype中的值拷贝到每个新建对象的__proto__中。每个对象都有一个局部__proto__拷贝。
因此动态修改构造函数原型后,已存在对象的__proto__属性未变,此后新建对象的__proto__属性会变。
在firefox中可以直接访问__proto__,但在其它浏览器中中它是一个隐藏属性。
只能通过constructor.prototype访问。绕了一个圈。
如果写一个属性,在自身未找到,则会在自身创建这个属性。以后对此属性的访问变成局部。
加快访问速度。隔离不同对象对此对象的写操作的影响。
可见对象继承了__proto__指向的公共对象的所有功能。
6.只有函数对象默认有prototype属性(用于拷贝给构造出的对象的__prototype__属性).
而对象都有__prototype__属性。
7.构造函数的prototype一般指向一个普通对象,当然也可以指向一个函数对象。
一个普通对象,如果其__proto__指向一个函数对象,而函数对象是有prototype的
因此此时其可以访问到__proto__指向的函数对象的prototype属性。
8.prototype中包含什么?
prototype指向的对象包含构造函数所创建的对象的共同属性和方法。
由同一个造函数构造出来的对象,其构造函数必然相同。
对象的constructor属性,系统默认指向自身的构造函数。
一旦用自定义的对象替换一个构造函数对象的原形,系统不会帮你维护constructor。
修改prototype对象中的constructor,指向构造函数。
对于刚创建的构造函数对象 。(fun.prototype.constructor == fun);
但是,由于构造函数的prototype可以修改,一旦修改,则上述等式不成立。
new 一个对象,首先创建一个空对象,然后以此对象作参数调用构造函数。
.
9. B.prototype= new A;
注意此时
B.prototype.constructor==A;
因此必须修正为
B.prototype.constructor=B;
但若修正,则不能通过B.prototype.constructor 调用构造函数A。当然一般情况无此必要。
进一步
function B()
{ //B 本身本来是没有constructor属性的,B.constructor其实访问的是B.prototype.constructor
//
this.constructor = arguments.callee;
}