2011-11-03 57 views
0

我要實現類似這樣的一個使用JS getter和setter方法語法:「嵌套」 getter和setter方法在JavaScript

globe.camera.position = Position.create(); 

這supossed等同於這個表達式:

globe.getCamera().setPosition(Position.create()); 

我在創造getter/setter方法,該.camera部分的「第一級」,這樣沒有問題:

function Camera() { 

    var x,y,z; 

this.__defineGetter__("camera", function() { 
     alert("This is the camera getter"); 
}); 

    this.__defineSetter__("camera", function(position) {    
     alert("This is the camera setter"); 
}); 

} 

... 

globe=new Camera(); 
globe.camera=... 
c=globe.camera; 

... 

,但林不太確定如何定義相機內的位置獲取器。我正在嘗試這樣的東西,但它不會工作:

function Position() { 

    this.__defineGetter__("position", function() { 
     alert("This is the position getter"); 
}); 

} 

globe.camera=new Position(); 
pos=globe.camera.position; 

getter中的警報不會顯示出來。任何線索?是否有可能實現這種行爲?我在Google上搜索了很多,但沒有找到正確的搜索條件,而獲取/設置者的例子往往非常簡單。提前致謝。

+1

你不必從getter返回一個結果嗎? (我認爲他們有更新的跨瀏覽器語法) – hugomg

+0

是的,在實際的代碼返回確實存在,但我撕開了功能內的內容,以澄清例子。關於語法,我見過的大多數例子都是用這種方式寫的。 –

回答

2

__defineGetter__和朋友是不標準的。

var Camera = Object.create({}, { 
    position: { 
    get: function() { 
     return Position.create(); 
    }, 
    set: function (p) { 
     this._position = p; 
    } 
    } 
}); 

Object.defineProperty(globe, "camera", { 
    get: function() { 
    return Object.create(Camera); 
    } 
}); 

你會想用Object.defineProperty

但是,爲什麼您使用getter和setter方法?他們是邪惡的。除非你聰明地做事,否則你應該避免它們。

+0

我知道,但我的客戶似乎認爲他們是s ** t,並堅持要我在這個項目中實施他們。我永遠不會在我的生活中在自己的項目中使用類似的東西(老實說,在我被要求去做之前,我甚至不知道這存在於JS中)。無論如何,我會試一試defineProperty,看看它是如何工作的。 –

+0

@ user995014告訴你的客戶,你的技術專家,而不是他。嚴重的是,人們爲什麼讓客戶推他們。你有沒有提到他們如何推斷99%的性能損失? – Raynos

+0

不幸的是我的客戶也是一家軟件開發公司,所以很難用這種東西來處理它們。他們認爲他們得到了正確的理由,並且他們把錢投入到了這件事中,所以......正如他們所說的那樣,客戶永遠是對的。順便說一句,你的方法解決了我的問題,非常感謝! –