美文网首页
JS的__proto__和prototype

JS的__proto__和prototype

作者: GeniusFinian | 来源:发表于2020-02-16 15:28 被阅读0次

最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__proto__和prototype分别有什么作用和区别呢?

先来看定义

__proto__:隐式原型,JS中万物皆对象,所有的对象都有一个__proto__的属性,这个属性会指向此对象构造函数的prototype属性

//构造函数Foo
function Foo(name){
  this.name = name;
}

//我是被Foo创建的实例对象f1
const f1 = new Foo('f1');
//我是被Foo创建的实例对象f2
const f2 = new Foo('f2');

console.log(f1.__proto__ === Foo.prototype); // true
console.log(f2.__proto__ === Foo.prototype); // true

prototype:显式属性,这个属性只有方法(function)上才会有,被构造的实例对象上是不存在这个属性的

console.log(f1.prototype); //undefined
console.log(Foo.prototype); //{constructor,__proto__}

可以看到Foo的prototype有两个属性,constructor为构造函数Foo,__proto__根据上面的解释应该指向Foo.prototype的构造函数的prototype属性,Foo.prototype本身就是个对象,对象的构造函数是Object,所以它应该指向的是Object的prototype,所以下面来看看是不是这样

console.log(Foo.prototype.constructor === Foo); //true
console.log(Foo.prototype.__proto__ === Object.prototype); //true

那么先抛出两个问题,大家先思考下,按照我们上面的解释,Foo有没有__proto__属性?Foo的__proto__属性应该指向谁呢?

再看class

接下来我们来看ES6的class,当class作为构造函数时,是否符合我们上述的定义呢?

class People{
  constructor(name){
    this.name = name;
  }
}

//我是被People创建的实例对象LiLei
const LiLei = new People('lilei');

console.log(LiLei.__proto__ === People.prototype)//true

事实证明,class作为构造函数时依然符合我们上述的定义,因为class其实是function的语法糖,如果我们typeof People的话,会得到function的答案

console.log(typeof People)//function

回到问题

这时候我们来回答上面提出的问题,Foo是一个function,但是它依然还是对象,因JS万物皆对象嘛,所以Foo肯定有__proto__,并且按照我们的定义,Foo的__proto__指向Foo的构造函数Function的prototype,来看看是不是这样

console.log(Foo.__proto__ === Function.prototype); //true

那么class People也是function,那它就应该和Foo一样

console.log(People.__proto__ === Function.prototype) //true

上图

e83bca5f1d1e6bf359d1f75727968c11_r.jpg

这时候看着这张图,再回顾刚才的内容,是不是更好理解了

原型终将有终点

图上已经很清楚了,原型的终点就是Object.prototype.__proto__,也就是null

原型的作用

__proto__:一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法
prototype:显式原型指向一个包含所有实例共享的属性和方法的对象

最后欢迎批评指正,共同进步

相关文章

  • 前端

    * __proto__和prototype 每个对象都有__proto__,但只有函数有prototype。当你创...

  • js _proto__ 和prototype

    object的_proto_ 和 函数的prototypeprototype是函数的一个属性,这个属性是一个指针,...

  • javascript 原型链图

    __proto__和 prototype __proto__是对象才有的属性prototype 是函数才有的属性

  • JS 中的 __proto__ 和 prototype,快来学习

    前端的三剑客:HTML、CSS、JS,今天,我们就来讲讲JS中的__proto__ 和prototype,它们到底...

  • JS的prototype和__proto__

    prototype和 __proto__ 的概念prototype是函数的一个属性(每个函数都有一个prototy...

  • JS的__proto__和prototype

    最近在回顾JS的原型和原型链的知识,熟悉JS的同学都知道JS的继承是靠原型链实现的,那跟原型链相关的属性__pro...

  • 彻底明白__proto__和prototype

    主题: # __proto__的由来 # prototype的由来 # __proto__和Prototyp...

  • js基础知识(二)

    一、js原型和原型链 1、原型讲解: 普通的对象:是没有prototype属性的,只有隐藏属性__proto__,...

  • JS中__proto__和prototype

    参考http://www.jianshu.com/p/dee9f8b14771js万物皆对象, 对象包括普通对象...

  • JS - 原型,prototype 和 __proto__

    原型和原型链是JS实现继承的方式。除了箭头函数,其它函数身上都有prototype属性。当该函数作为构造函数生成对...

网友评论

      本文标题:JS的__proto__和prototype

      本文链接:https://www.haomeiwen.com/subject/sgjpfhtx.html