2013-04-24 24 views
1

我目前正在考慮在node.js內部實現一個包裝其他應用程序的虛擬機。爲此,我將重寫一些基礎知識,但有一點我不確定。可能在不調用`test`的情況下得到b?

var A = (function() { 
    var b = 1; 

    var A = function() {}; 
    A.prototype.test = function() { // Can't touch this 
     return b; 
    }; 
    A.prototype.foo = function(callback) { 
     callback(); 
    }; 
    return A; 
})(); 

// Objective: Get b without touching `test` in any way 

這有可能以任何方式嗎?通過注入原型或使用call(),apply(),bind()或類似的?任何其他反思?

+0

看起來你會自己吃你的餅乾;-) – zerkms 2013-04-24 01:40:23

+0

事實上,A.test()應該返回寫爲b,除非我誤解你... – Jonah 2013-04-24 01:41:02

+0

不能這樣做......現在我的餅乾! – elclanrs 2013-04-24 01:41:30

回答

0

沒有使用test?使用不同的function

var A = (function() { 
    var b = 1; 

    // ...  

    A.prototype.foo = function() { 
     return b; 
    }; 
    return A; 
})(); 

console.log(new A().foo()); 

否則,沒有。片段是closure只能通過在相同範圍內定義的函數來訪問局部變量。是他們的工作方式。

+0

謝謝。如果實際上不可能,這會幫我一個忙。我迄今爲止試過的東西:在閉包之外創建A.prototype.foo,然後調用,將它與A和新A()綁定。不出所料,這不起作用。我只是問自己是否還有其他令人討厭的注入機制,因爲這會對我的應用程序的安全性造成實際的風險:)否 – dcode 2013-04-24 01:51:49

+0

@dcode這可能是通過本機引擎的擴展。一個[Node.js插件](http://nodejs.org/api/addons.html),也許。現有的模塊看起來像是處於這種能力上(儘管只是猜測),就像['contextify'](https://npmjs.org/package/contextify)。 – 2013-04-24 01:55:22

+0

你說得對,那可能是可能的。我將阻止加載原生模塊。我只希望真的沒有別的辦法:) – dcode 2013-04-24 01:57:56

相關問題