2017-02-18 19 views
0

看到這個類的定義:上Object.getPrototypeOf把方法(這)

function MyClass (property) { 
    // Private 
    var privateVariable; 
    var privateMethod = function() {}; 

    // Public 
    this.publicProperty = property; 
    this.publicPrivilegedMethodOnInstance = function() {}; 
    Object.getPrototypeOf(this).publicPrivilegedMethodOnPrototype = function() {}; 
} 
MyClass.prototype.publicMethod = function() {}; 

var myMyClass = new MyClass('foo'); 

方法publicPrivilegedMethodOnPrototype是公共的,但可以訪問私有變量(publicMethod)不能。它也在原型上共享,其中publicPrivilegedMethodOnInstance不是。

定義publicPrivilegedMethodOnPrototype這樣的任何缺點?我猜ECMAScript 5是一個需求,並且每次MyClass被實例化時該方法都會被重新定義。

+0

由於**關閉**,publicPrivilegedMethodOnPrototype可以訪問私有變量。 –

+0

@ibrahimmahrir是的,這就是主意。 'publicMethod'不能做到這一點,因爲它在MyClass函數定義之外。 –

回答

3

這是一個非常糟糕的主意。

所以你創建了很多對象,但是當你將屬性賦值給它們所有的原型時,在某些點上,甚至不想訪問某些值的函數都會這樣做...... 這很奇怪

一個給定的原型函數是指訪問屬性從其自己使用this原型對象:

function X() { 
    this.text = "hello world"; 
} 
X.prototype.doStuff() { 
    console.log(this.text); 
}; 

因此,避免反模式。這個不成立。我的建議是,你需要在JavaScript中處理缺乏訪問修飾符,而不是盲目尋找解決方法。

+0

謝謝!你能否詳細說明「甚至不能獲得某些價值的功能都可以做到這一點」?因爲不是'MyClass.prototype === Object.getPrototypeOf(this)',即方法放在同一個「級別」上?但'publicPrivilegedMethodOnPrototype'可以通過關閉訪問私有變量。 –

+0

@TomSöderlund是的,這是你的想法的問題。你是否想象不僅僅是一個從相同構造函數創建的對象訪問最後一個構造函數調用的捕獲變量? :\ –

+0

現在我明白你的觀點了。謝謝! –