Why this behaviour?__proto__ vs prototype?

前端 未结 3 882
南旧
南旧 2021-01-15 10:28
    function Obj1(name){
        this.__proto__={
            Name:name,
            getName:function(){
                alert(this.Name); 
            }


        }         


        
相关标签:
3条回答
  • 2021-01-15 10:37

    __proto__ (which is not standard (but might be soon))) sets an object's prototype.

    .prototype sets the prototype of objects created by invoking the function it was set on as a constructor using new

    Also worth mentioning is Object.create

    Here are examples:

    Pseudo-classical with .prototype:

    function Car(){
       this.x = 15;
    }
    Car.prototype.y = 10;
    
    var g = new Car();
    g.y; // this is 10;
    

    Using __proto__ (don't use this!):

    var g = {x:15};
    g.__proto__ = {y:10};
    g.y; // this is 10;
    

    This way is correct, and does not use constructors with new:

    var g = Object.create({y:10}); //creates x with prototype {y:10}
    g.x = 15;
    g.y; // this is 10
    

    Here is an interesting tutorial on MDN covering these.

    0 讨论(0)
  • 2021-01-15 10:50

    __proto__ is not a standard property.

    Anyway every object created by new will get a prototype from the .prototype member of the constructor (a function). Note that the prototype member has no name, you cannot access it directly, you need Object.getPrototypeOf(x).

    If you want to create an object with a given prototype the code is Object.create(proto) that is more or less equivalent to

    function makeObjectWithPrototype(x) {
        function makeit() { }
        makeit.prototype = x;
        return new makeit();
    }
    
    0 讨论(0)
  • 2021-01-15 10:59

    Only functions has the property prototype. You need to set the prototype on the function self.

    function Obj2(name){
        this.name = name;
    }
    
    Obj2.prototype={
        getName:function(){
           alert(this.Name); 
        }
    };
    
    0 讨论(0)
提交回复
热议问题