为什么会出现这种情况?__ proto__ vs prototype?

时间:2013-05-06 08:19:07

标签: javascript prototype

    function Obj1(name){
        this.__proto__={
            Name:name,
            getName:function(){
                alert(this.Name); 
            }


        };

    }

    function Obj2(name){
       this.prototype={
           Name:name,
           getName:function(){
           alert(this.Name); 
           };


       };

    }
    x=new Obj1("blue shark");
    z=new Obj2("red shark");
    x.getName();
    z.getName();// error:z.getName() is not a function

两者之间有什么区别?有人说prototype仅用于构造函数,但在这种情况下它不起作用....而__proto__工作为什么?

3 个答案:

答案 0 :(得分:5)

__proto__(这不是标准的(但可能会很快)))设置对象的原型。

.prototype设置通过使用new

调用它作为构造函数设置的函数创建的对象的原型

另外值得一提的是Object.create

以下是示例:

.prototype的伪古典:

function Car(){
   this.x = 15;
}
Car.prototype.y = 10;

var g = new Car();
g.y; // this is 10;

使用__proto__(不要使用此内容!):

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

这种方式是正确的,并且不使用带new的构造函数:

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

这是an interesting tutorial on MDN covering these

答案 1 :(得分:2)

只有函数具有属性原型。 您需要在函数self上设置原型。

function Obj2(name){
    this.name = name;
}

Obj2.prototype={
    getName:function(){
       alert(this.Name); 
    }
};

答案 2 :(得分:2)

__proto__不是标准财产。

无论如何,new创建的每个对象都将从构造函数的<{1}}成员 (函数)中获取原型。请注意,原型成员没有名称,您无法直接访问它,您需要.prototype

如果要创建具有给定原型的对象,则代码Object.getPrototypeOf(x)或多或少等同于

Object.create(proto)