原型鏈爲什麼我不能訪問從A「X」的財產?麻煩在JavaScript中
A = {}; B = {y: 'y'}; C = {x: 'x'}; A.prototype = B; B.prototype = C; A.x
原型鏈爲什麼我不能訪問從A「X」的財產?麻煩在JavaScript中
A = {}; B = {y: 'y'}; C = {x: 'x'}; A.prototype = B; B.prototype = C; A.x
物體的原型不是由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();
};
}
你'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
@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
@patrick,@CMS:謝謝你們,那是什麼我得到一些東西,然後消失。非常感激。 – 2010-10-31 21:18:20