2013-05-06 76 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

相關問題