美文网首页
JS原型链

JS原型链

作者: 大嵩的格洛米 | 来源:发表于2021-05-15 17:29 被阅读0次

    原型链

    每个对象都可以有一个原型proto,这个原型还可以有它自己的原型,以此类推,形成一个原型链。查找特定属性的时候,我们先去这个对象里去找,如果没有的话就去它的原型对象里面去,如果还是没有的话再去向原型对象的原型对象里去寻找...... 这个操作被委托在整个原型链上,这个就是我们说的原型链了。

    prototype:

    prototype属性,它是函数所独有的,它是从一个函数指向一个对象。它的含义是函数的原型对象,也就是这个函数(其实所有函数都可以作为构造函数)所创建的实例的原型对象; 这个属性是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象);

    proto:

    proto 是原型链查询中实际用到的,它总是指向 prototype,换句话说就是指向构造函数的原型对象,它是对象独有的。注意,为什么Foo构造也有这个属性呢,因为再js的宇宙里万物皆对象,包括函数;

    image.png

    代码解释

    var Person=function (name) {                     
         this.name=name;
    }     
    Person.prototype.head=1;
    Person.prototype.eyes=2;
    Person.prototype.speak=function () {
        alert("我是人,我的名字是:"+this.name);
    }
    Person.speak=function () {
        alert("我是人,我的名字是:"+this.name);
    }
    
    var p1=new Person("许嵩");
    var p2=new Person("孙燕姿");
    p1.age=32;
    p1.sex='female';
    

    总结

    prototype相当于一个大类的制作方法(地址),proto相当于实例去访问制作模板的指针,所以实例都有proto
    而Function 虽然是Object制造出来的,因为Function.prototype.proto === Object.prototype
    但这两种类型是独立的

    JavaScript引擎是个工厂。最初,工厂做了一个最原始的产品原型。这个原型叫Object.prototype,本质上就是一组无序key-value存储({})之后,工厂在Object.prototype的基础上,研发出了可以保存一段“指令”并“生产产品”的原型产品,叫函数。起名为Function.prototype,本质上就是[Function: Empty](空函数)为了规模化生产,工厂在函数的基础上,生产出了两个构造器:生产函数的构造器叫Function,生产kv存储的构造器叫Object。你在工厂定制了一个产品,工厂根据Object.prototype给你做了一个Foo.prototype。然后工厂发现你定制的产品很不错。就在Function.prototype的基础上做了一个Foo的构造器,叫Foo。工厂在每个产品上打了个标签proto,以标明这个产品是从哪个原型生产的。为原型打了个标签constructor,标明哪个构造器可以依照这个原型生产产品。为构造器打了标签prototype,标明这个构造器可以从哪个原型生产产品。所以,我觉得先有Function还是Object,就看工厂先造谁了。其实先做哪个都无所谓。因为在你定制之前,他们都做好了

    https://www.zhihu.com/question/35442532/answer/62984459

    相关文章

      网友评论

          本文标题:JS原型链

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