为了账号安全,请及时绑定邮箱和手机立即绑定

麻烦大佬帮忙解释一下__proto__ 和 prototype 的区别?

麻烦大佬帮忙解释一下__proto__ 和 prototype 的区别?

慕无忌1623718 2022-01-01 07:07:25
var arr = new Array();console.log(arr.prototype); //undefinedconsole.log(arr.__proto__); //空数组console.log(Array.prototype); //空数组console.log(Array.__proto__); //function()我知道在 new 的过程中,有三个步骤(1) var arr = {};//初始化一个 arr 对象(2) arr.__proto__ = Array.prototype;(3) Array.call(arr); //回调函数构造 arr然后在 ECMA 中可以查到 Array.prototype = new Object();所以 arr.prototype undefined, arr.__proto__ == Array.prototype 我可以理解,但是为什么 Array.prototype 是一个空数组, Array.__proto__ 确是一个 function() 呢?在 ECMA 中查到,Array 的构造函数是 function Array(){} ,是不是跟这个有关呢?
查看完整描述

1 回答

?
BIG阳

TA贡献1859条经验 获得超6个赞

  1. 每个函数就是一个对象(Function),函数对象都有一个子对象 prototype对象,类是以函数的形式来定义的。prototype表示该函数的原型,也表示一个类的成员的集合。

  2. 也就是说prototype 是原型,是Function对象才有的属性,原型主要是用来实现继承,从而用js 进行面向对象编程

  3. 如 Foo 是一个Function对象,是有prototype属性的 ,它指向一个Boo 的实例对象

  4. 而p 是一个 Foo 的实例对象,不是一个Function 对象,没有prototype 属性,但是p有一个私有属性__proto__ 这个属性,一般不直接访问的,事实上这个属性就是 Foo.prototype
    在chrome控制台中测试
    console.log(p.__proto__ == Foo.prototype)
    VM952:2 true
    console.log(p.__proto__ === Foo.prototype)
    VM956:2 true
    上述测试都输出true,说明他们确实是同一个东西

  5. js的继承是通过原型继承的,有个原型链的概念,而原型链就是通过__proto__属性实现的
    function Boo() {this.x="test in Boo";}
    function Foo() {this.y = "test in Foo"}
    Foo.prototype = new Boo;
    p=new Foo;
    console.log(p.y);//test in Foo

    console.log(p.x);//test in Boo
    Foo 中并没有属性x,当p找不到属性x时,就到p.__proto__属性(指向原型)中找,原型中是有x属性的,于是输出x的值

  6. 如果不考虑内部实现,就好像属性x是从Boo中继承的一样
    console.log(p.__proto__);   输出 Boo{}表示一个空的Boo对象(通过 new Boo 创建的 )

    p.__proto__.p.__proto__这个会报错,因为p.__proto__中没有名为p的属性

    function Foo() {}
    p=new Foo;
    console.log(p.__proto__);
    因为没有改变Foo.prototype 的属性,所以仍然指向它自己(Foo)
    而 p.__proto__ 就是 Foo.prototype 所有输出Foo{} 表示一个空的Foo对象。

 


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 148 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信