__proto__ is the [[prototype]] attribute of the object, but in most browsers, __proto__ is used to represent the [[prototype]] attribute, because [[prototype]] is a standard. Different browsers have different implementations. Get the [[prototype]] of an Object in ES5 using object.getProtoTypeof. In ES6, you can modify the [[prototype]] of an Object directly using object. setPrototypeOf. For convenience, the following article uses __proto__ to represent the object’s [[prototype]].
The prototype property is a function-specific property. When you create a function, js automatically assigns the function the prototype property, which is an empty object. So, functions are very special in JS and are called first-class citizens.
[1] Objects have the __proto__ attribute, which refers to the prototype object of the object’s constructor.
[2] The method has the __proto__ attribute as well as the prototype attribute, which refers to the prototype object of the method.