2015-02-06 204 views
2

我搜索了很長時間的這個問題。不會找到任何答案來滿足我的問題。我正在嘗試的是:JavaScript構造函數中的函數調用原型函數

function myClass() { 
    function privateFunction() { 
     publicFunction(); //Error 
    } 
} 

myClass.prototype.publicFunction = function() { 
    this.variable = 1; 
} 
myClass.prototype.publicFunction2= function() { 
    return this.variable; 
} 

這是給我的錯誤。我沒有得到真正的問題是什麼:

我試了一下:

this.publicFunction(); 

然後:

myClass.publicFunction(); 

然後:

myClass.prototype.publicFunction(); 

這工作,但它覆蓋每個目的。彷彿它在不同的JS對象中是靜態的。

+0

在'privateFunction'中對'myClass'的'this'值使用'bind'或者閉包。或者你甚至可以使用'call'。所以問題在於你想用'this.publicFunction()''this'這個值的範圍[ – Xotic750 2015-02-06 12:58:38

+0

]如何在回調中訪問正確的''this''/context(http: //www.facebook.com/stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback) – Scimonster 2015-02-06 13:03:36

回答

1

您尚未正確聲明原型功能。調用函數publicFunction時,您還錯過了this關鍵字。

私有函數(privateFunction)不是該類的成員,因此如果要將其作爲函數調用,則必須爲其指定上下文。

function myClass() { 
 
    function privateFunction() { 
 
     this.publicFunction(); 
 
    } 
 

 
    privateFunction.call(this); 
 
    document.write(this.publicFunction2()); // show value in Stackoverflow snippet 
 
} 
 

 
myClass.prototype.publicFunction = function() { 
 
    this.variable = 1; 
 
} 
 

 
myClass.prototype.publicFunction2 = function() { 
 
    return this.variable; 
 
} 
 

 
var myClassPrototype = new myClass();

+0

檢查我的編輯。我試過這個。但不幸的是沒有工作。 [Here](http://jsfiddle.net/srivastaveer/dg1negkb/)是我正在嘗試完成的代碼..相當長。但易於理解 – 2015-02-06 13:05:07

+0

'this.publicFunction()'說:'undefined不是函數' – 2015-02-06 13:08:29

+0

@VeerShrivastav:我在發佈代碼後立即編輯了代碼,它看起來像編輯前的代碼。更新頁面並嘗試。在你的User類中,你要調用例如'User.prototype.setEmpId([userKey]);'在'formUserObjectFromArguments'函數中。這會將其稱爲原型對象的方法,而不是用戶對象的方法。如果你想調用本地函數作爲一個方法,你可以使用'formUserObjectFromArguments.call(this)',它允許你在函數中調用'this.setEmpId([userKey]);'。 – Guffa 2015-02-06 13:14:04

0

,因爲它是一個私有函數裏面你沒有訪問它。 嘗試這樣的:

function myClass() { 
    function privateFunction() { 

    } 

    this.publicFunction = function() { 
     alert('ok') 
    } 

} 

那麼如果你

var obj = new myClass() 
obj.publicFunction() 

可以看到警報

爲了繼承,你需要一些其他的東西類。這是一個完整的例子。

現在這裏是相關的js代碼。把它放在一個文件來測試它:

function Operators() { 
    //mandatory 
    var self = this 

    //private 
    var IPT_X = '#x' 
    var IPT_Y = '#y' 

    //public 
    this.x = 0 
    this.y = 0  

    this.showOperators = function() { 
     //use of a private property (IPT_X) and a public property (this.x) 
     $(IPT_X).val(this.x) 
     $(IPT_Y).val(this.y) 
    } 

    this.clean = function() { 
     this.x = 0 
     this.y = 0 
     // call to a local public method 
     this.showOperators() 
    } 

    this.updateOperators = function(_x, _y) { 
     // use of a public property when call from 
     // derived class method is necessary 
     self.x = _x 
     self.y = _y 
    } 
} 

function Randomizer() { 
    // mandatory for derived classes 
    Operators.call(this) 
    // mandatory for overloaded methods with call to the inherited method 
    var parentUpdateOperators = this.updateOperators 
    var self = this 

    // private 
    function getRandomNumber() { 
     return Math.round(Math.random() * 1000) 
    } 

    // public 
    this.updateOperators = function(_x, _y) { 
      // call to inherited method of superior class 
     parentUpdateOperators(_x, _y) 
      // call to method of superior class 
      self.showOperators() 
    } 

    this.populateRandomNumbers = function() { 
     // call to public local method (this.updateOperators()) 
     // and to a local private method (getRandomNumber()) 
     this.updateOperators(getRandomNumber(), getRandomNumber()) 
    } 

    // init 
    this.populateRandomNumbers() 
} 
// Mandatory for derived classes. Allows access to superior classes with 
// more than 2 levels of inheritance ("grandfather" classes) 
Randomizer.prototype = Object.create(Operators.prototype) 

function Operations() { 
    Randomizer.call(this) 
    var self = this 

    //private 
    var IPT_RES = '#res' 
    var BTN_SUM = '#sum' 
    var BTN_SUBTRACT = '#subt' 
    var BTN_MULTIPLY = '#mult' 
    var BTN_DIVISION = '#div' 
    var BTN_CLEAN = '#clean' 
    var BTN_RAND = '#rand' 

    function calcSum() { 
     return self.x + self.y 
    } 
    function calcSubtraction() { 
     return self.x - self.y 
    } 
    function calcMultiplication() { 
     return self.x * self.y 
    } 
    function calcDivision() { 
     return self.x/self.y 
    } 

    function showRes(val) { 
     $(IPT_RES).val(val) 
    } 

    //public 
    this.sum = function() { 
     // call to 2 local private methods 
     showRes(calcSum()) 
    } 
    this.subtract = function() { 
     showRes(calcSubtraction()) 
    } 
    this.multiply = function() { 
     showRes(calcMultiplication()) 
    } 
    this.division = function() { 
     showRes(calcDivision()) 
    } 

    // init 
    $(BTN_SUM).on('click', function() { self.sum() }) 
    $(BTN_SUBTRACT).on('click', function() { self.subtract() }) 
    $(BTN_MULTIPLY).on('click', function() { self.multiply() }) 
    $(BTN_DIVISION).on('click', function() { self.division() })  
    $(BTN_CLEAN).on('click', function() { self.clean() }) 
    $(BTN_RAND).on('click', function() { self.populateRandomNumbers() }) 
} 
Operations.prototype = Object.create(Randomizer.prototype) 

var obj = new Operations() 

如果你打算在這裏測試是html代碼:

X: <input id='x'> 
<br> 
Y: <input id='y'> 
<br> 
Res: <input id='res'> 
<br> 
<input id='sum' type='button' value='+'> 
<input id='subt' type='button' value='-'> 
<input id='mult' type='button' value='*'> 
<input id='div' type='button' value='/'> 
<input id='clean' type='button' value='C'> 
<input id='rand' type='button' value='Rand'> 

不要忘記添加的jQuery文件。

這裏是它是代碼的jsfiddle:

http://jsfiddle.net/vqqrf2cb/24/

+0

當我嘗試繼承此類時,這不會解決問題。抱歉!不值得。我最初嘗試過。用原型告訴我。 – 2015-02-06 13:02:34

+0

繼承這個類,你需要繼承類中的其他一些行。等一分鐘,因爲我給你一個完整的例子。 – 2015-02-06 13:07:06

+0

檢查jsfiddle我把例子 – 2015-02-06 13:10:14

1

會不會封閉夠嗎?

首先,我會按照慣例

function MyClass() { 
    var myInstance = this; 

    function privateFunction() { 
     // closure 
     myInstance.publicFunction(); 
    } 
} 

MyClass.prototype.publicFunction = function() { 
    this.variable = 1; 
} 
MyClass.prototype.publicFunction2= function() { 
    return this.variable; 
} 

現在改名myClassMyClass你應該能夠實例化這種方式

var myInstance = new MyClass(); 

現在你可以看到privateFunction是永遠稱爲,它會有點多餘的稱呼,但我只是試圖展示如何在技術上實現它。

+0

雖然這個工程,它不是很衛生。 – Xotic750 2015-02-06 13:10:40

+0

這就是我最後所說的,正如你所看到的,但它仍然提出了這個問題。你說得對,它根本不衛生。 – axelduch 2015-02-06 13:12:25

0

試試這個:

function myClass() { 
    function privateFunction(obj) { 
    obj.privilegedFunction1(); 
    }; 
    this.privilegedFunction1 = function() { 
    this.variable = 1; 
    }; 
    this.privilegedFunction2 = function() { 
    privateFunction(this); 
    }; 
} 

myClass.prototype.publicFunction2 = function() { 
    return this.variable; 
} 

var test = new myClass(); 
test.privilegedFunction2(); 
console.log(test.publicFunction2()); 

這:

function myClass() { 
    function privateFunction(obj) { 
    obj.publicFunction1(); 
    }; 
    this.privilegedFunction2 = function() { 
    privateFunction(this); 
    }; 
} 

myClass.prototype.publicFunction1 = function() { 
    this.variable = 1; 
} 

myClass.prototype.publicFunction2 = function() { 
    return this.variable; 
} 

var test = new myClass(); 
test.privilegedFunction2(); 
console.log(test.publicFunction2()); 

你可能想VS私人與Javascript中的特權成員閱讀了一些關於公衆。 http://javascript.crockford.com/private.html

要點:本文像

  1. 公共(原型)成員有私人的訪問權限。
  2. 特權(此)成員可以訪問私有。
  3. 私有函數可以通過傳遞的上下文參數訪問特權和公共成員。
相關問題