2013-05-06 119 views
2
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__工作为什么?为什么会出现这种情况?__ proto__ vs prototype?

+0

或多或少相当于这让很少的意义设置构造函数中的原型创建一个对象。此外__proto__不是ecma标准的一部分。 – mpm 2013-05-06 08:22:26

+0

[尚未](http://people.mozilla.org/~jorendorff/es6-draft.html#sec-B.3.1),无论如何。 – 2013-05-06 08:24:30

+0

[\ _ \ _ proto \ _ \ _ Vs可能的重复。原型在JavaScript](http://stackoverflow.com/questions/9959727/proto-vs-prototype-in​​-javascript) – Bergi 2014-01-23 22:16:03

回答

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

+2

这是一个有趣的评论语言创建者布兰登艾奇在'__proto__'的方式https:// mail .mozilla.org/pipermail/es-discuss/2010-April/010917.html – 2013-05-06 08:27:43

+0

但是'z = new Obj2()',它是使用'new'创建的 – 2013-05-06 08:28:05

+0

@RomanticElectron阅读答案和示例_careful_ __''.prototype '在_constructor函数_上设置。在你的例子中,你将设置'Obj2'的'.prototype'而不是'this'。 – 2013-05-06 08:29:03

2

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

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

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

__proto__不是标准属性。

无论如何,由new创建的每个对象都将从构造函数(函数)的.prototype成员中获得原型。请注意,原型成员没有名字,您无法直接访问它,您需要Object.getPrototypeOf(x)

如果你想给定的原型代码Object.create(proto)那就是

function makeObjectWithPrototype(x) { 
    function makeit() { } 
    makeit.prototype = x; 
    return new makeit(); 
} 
+2

这就是Crockford的BEGET函数:)用现代JS你可以使用Object.create而不是其他的好处。另外,您可以使用标准的Object.getPrototypeOf来获取对象的原型 – 2013-05-06 08:37:17

相关问题