原型链与构造函数

首先:声明的函数,是有prototype属性的。但是对象是没有prototype的。

一、函数

  • console.dir(Foo)可以看到,有prototype属性和__proto__属性。
  • Foo.prototype里的constructor指向Foo自己 , __proto__指向Object.prototype。
  • 而Foo.__proto__指向Function.prototype

这里写图片描述

二、Object

  • console.dir(Object)可以看到,有prototype属性和__proto__属性。
  • Object.prototype里的constructor指向Object,__proto__指向null
  • Object.__proto__指向Function.prototype。

三、Function 构造函数

  • console.dir(Function)可以看到,有prototype属性和__proto__属性。
  • Function.prototype里的constructor指向Function,__proto__指向Object.prototype
  • Function.__proto__指向Function.prototype。

四、对象

1、字面量创建对象
  • 字面量创建的对象__proto__的默认指向Object.prototype。
  • 没有prototype属性。console.log(b.prototype) 结果undefined

这里写图片描述

2、构造函数创建对象
    function F () {}

    // 方法一:重写prototype
    F.prototype = {
      //constructor: F,
      name: 'liu',
      method: function () {}
    }

    // 方法二:拓展prototype
    F.prototype.name = 'yong';
    F.prototype.method = function () {};

    var f = new F();
    console.log(f);
  • 构造函数创建对象:__proto__下有constructor和__proto__和Foo的prototype定义的属性及方法。
  • __proto__下的constructor指向Foo本身。
  • __proto__下的__proto__指向Object.prototype。

注意:

方法一:直接重写prototype,如果我不指定constructor,将导致如下图,没有了constructor。

这里写图片描述

方法二:拓展prototype,保证了constructor的正确指向。

这里写图片描述

五、附一张图对上面总结

作图工具采用processOn

这里写图片描述

六、附示例一份和图解

该示例原出处: Dmitry Soshnikov
参考翻译出处: 魏志峰(@JeremyWei)翻译+投稿

    function Foo(y) {
      this.y = y;
    }

    Foo.prototype.x = 10;

    Foo.prototype.calculate = function (z) {
      return this.x + this.y + z;
    };

    var b = new Foo(20);
    var c = new Foo(30);

    b.calculate(30); // 60
    c.calculate(40);

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值