2010-10-31 88 views

回答

8

物體的原型不是由prototype屬性反射(雖然混淆可能)。事實上,沒有標準,設置對象的原型您創建它(和它只是在最近,有一直到任何標準的方法來檢索對象的原型)後的直接方式。在你引用的代碼中,你所做的只是在對象上創建一個名爲prototype的普通屬性;它也可能被稱爲foo。 :-)

在JavaScript中的特殊prototype屬性,但它在功能:這是一個將被指定爲通過該函數創建的對象的原型對象,如果你用new關鍵字使用(例如,作爲構造函數)。事實上,直到最近的唯一方法分配一個原型的目的是通過構造函數:

function makeA() { 
} 
makeA.prototype.x = "foo"; 

A = new makeA(); 
alert(A.x); // alerts "foo" 

...這仍然是這樣做的唯一被廣泛支持的手段。

事情與新ECMAScript 5th edition specification稍微改變,但是當你創建它,事後沒有你仍然可以只設置一個對象的原型。新東西所做的是讓它可以直接完成,而不是通過構造函數來完成。這是第15.2.3.5節中的新功能Object.create,但尚未得到廣泛支持。 (有第5版的其他幾個漂亮的功能,包括能夠通過Object.getPrototypeOf得到對象的原型。但還是沒有辦法在事後修改)

有一個非標準屬性,一些實現(如Firefox的SpiderMonkey的引擎)提供,__proto__,但它沒有得到廣泛支持,並沒有包含在最新的規範。

使用新Object.create,你可以做你想做的是這樣的:

var C = {x: 'x'}; 
var B = Object.create(C); 
B.y = 'y'; 
var A = Object.create(B); 
alert(A.x); // alerts "x" 

...但由於Object.create是太新了,你會發現,在大多數的實現,你需要創建它,因爲它不在那裏。

if (!Object.create) { 
    // An *incomplete* emulation of Object.create, doesn't support the optional 
    // second parameter defined by the spec. 
    Object.create = function(proto) { 
     var obj; 

     // There's no point in calling this with a null or otherwise "falsy" 
     // prototype, but let's handle it if you do 
     if (!proto) { 
      return {}; // Just a generic object 
     } 

     // Define a constructor object that uses 
     // the prototype 
     function ctor() { 
     } 
     ctor.prototype = proto; 

     // Create and return the object 
     return new ctor(); 
    }; 
} 
+1

你'Object.create'例子給我一個'TypeError':如果我們忽視了它的第二個參數(這隻能部分模擬)是很容易。根據[MDC](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/create),你應該有這樣的事情:'變種B =的Object.create(C,{Y:{值: 'Y'}});' – user113716 2010-10-31 20:08:25

+1

@patrick,@TJ,是的,'properties'參數應該是一個包含屬性描述符的對象,如果'Object.defineProperty'或'Object.defineProperties'所不具備的是更好地不支持這個參數,因爲你不能真正模仿ES3中的屬性屬性。這'Object.create'墊片也有另外一個問題,標準的'Object.create'方法,可以接受'null'來創建一個對象,不從任何繼承,在這種情況下,'new'運營商將取代' null'爲'Object.prototype',我也建議在這種情況下,拋出...... [見...](http://j.mp/al68q0) – CMS 2010-10-31 20:23:18

+0

@patrick,@CMS:謝謝你們,那是什麼我得到一些東西,然後消失。非常感激。 – 2010-10-31 21:18:20