__proto__ VS. prototype in JavaScript

后端 未结 30 1893
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-11-21 06:14

This figure again shows that every object has a prototype. Constructor function Foo also has its own __proto__ which is Function.prototype, a

30条回答
  •  北海茫月
    2020-11-21 06:36

    Prototype VS. __proto__ VS. [[Prototype]]

    When creating a function, a property object called prototype is being created automatically (you didn't create it yourself) and is being attached to the function object (the constructor).
    Note: This new prototype object also points to, or has an internal-private link to, the native JavaScript Object.

    Example:

    function Foo () {
        this.name = 'John Doe';
    }
    
    // Foo has an object property called prototype.
    // prototype was created automatically when we declared the function Foo.
    Foo.hasOwnProperty('prototype'); // true
    
    // Now, we can assign properties and methods to it:
    Foo.prototype.myName = function () {
        return 'My name is ' + this.name;
    }
    

    If you create a new object out of Foo using the new keyword, you are basically creating (among other things) a new object that has an internal or private link to the function Foo's prototype we discussed earlier:

    var b = new Foo();
    
    b.[[Prototype]] === Foo.prototype  // true
    


    The private linkage to that function's object called double brackets prototype or just [[Prototype]]. Many browsers are providing us a public linkage to it that called __proto__!

    To be more specific, __proto__ is actually a getter function that belong to the native JavaScript Object. It returns the internal-private prototype linkage of whatever the this binding is (returns the [[Prototype]] of b):

    b.__proto__ === Foo.prototype // true
    

    It is worth noting that starting of ECMAScript5, you can also use the getPrototypeOf method to get the internal private linkage:

    Object.getPrototypeOf(b) === b.__proto__ // true
    


    NOTE: this answer doesn't intend to cover the whole process of creating new objects or new constructors, but to help better understand what is __proto__, prototype and [[Prototype]] and how it works.

提交回复
热议问题