javascript 函数对象的原型与普通对象的原型

如何理解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访问。绕了一个圈。

  

 5. 写时拷贝。一个对象读一个属性,如果在自身未找到,就在__proto__指向的公共对象中查找。

   如果写一个属性,在自身未找到,则会在自身创建这个属性。以后对此属性的访问变成局部。

    加快访问速度。隔离不同对象对此对象的写操作的影响。

    可见对象继承了__proto__指向的公共对象的所有功能。

6.只有函数对象默认有prototype属性(用于拷贝给构造出的对象的__prototype__属性).

   而对象都有__prototype__属性。

7.构造函数的prototype一般指向一个普通对象,当然也可以指向一个函数对象。

   一个普通对象,如果其__proto__指向一个函数对象,而函数对象是有prototype的

    因此此时其可以访问到__proto__指向的函数对象的prototype属性。

8.prototype中包含什么?

   prototype指向的对象包含构造函数所创建的对象的共同属性和方法。

   由同一个造函数构造出来的对象,其构造函数必然相同。

   因此constructor 不是对象本身的属性,而是对象的__proto__属性对象中的属性。

    对象的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;

 } 



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值