[英]Passing a prototype's function as parameter without losing the 'this' context
[英]Losing function context in calling prototype function
我試圖弄清楚如何從構造函數獲取函數上下文到其原型函數之一。 但是,當我在原型函數中檢查“ this”值時,它只是將其顯示為“ Object”,而不是調用(ctor)上下文。
所以我有代碼:
function CL(){
...
(stuff)
...
console.log(this);
protoFunc(this);
}
CL.prototype.protoFunc = function(context) {
var self = context;
console.log(context);
...
}
調用protoFunc之前的函數上下文是CL。 但是在protoFunc中,它是[Object object]。
如何將函數上下文放入protoFunc?
謝謝。
萊斯
您不能像這樣調用protoFunc
,您需要在this
。 你沒有收到錯誤嗎? 代碼應為:
function CL(){
...
(stuff)
...
console.log(this);
this.protoFunc();
}
這會給你正確的this
原型方法中-提供CL
被正確地稱為new
:
var instance = new CL();
您甚至不需要這樣做。 嘗試這個:
function CL(name) {
//for example...
this.name = name;
}
CL.prototype.protoFunc = function () {
console.log(this);
};
然后,您將不得不使用構造函數實例化一個對象。
var x = new CL('Bob');
x.protoFunc();
//=> logs {name: 'Bob'}
如果您試圖將ACTUAL CONSTRUCTOR FUNCTION納入您的方法中,那么那里也不需要任何技巧。
CL.prototype.protoFunc = function () {
var cTor = CL;
console.log(cTor);
};
這是您要找的東西還是您想要的其他東西?
編輯:
如果要從構造函數中調用原型函數,則應執行以下操作:
function protoFunc() {
console.log(this);
}
function CL(name) {
protoFunc.call(this);
}
CL.prototype.protoFunc = protoFunc;
通過調用函數或使用Function.prototype.bind設置函數的this值。
鑒於:
function CL(){
console.log(this); // a new object
protoFunc(this); // protoFunc doesn't exist on CL's scope chain and will throw an error
}
如果按如下方式調用CL(並假設未使用bind ):
CL()
它的這種價值尚未確定,所以在進入功能在非嚴格模式將設置為全局(窗口)對象。 在嚴格模式下,它將是不確定的 。
如果使用new調用CL:
var cl = new CL()
那么函數中的此對象將引用一個新對象,就像由new Object()
創建的一樣,即它是對該實例的引用。 由於默認情況下會返回此新對象,並將其分配給cl ,因此將保留對構造函數this的引用,因此無需保留任何其他引用。
請注意,每次調用CL都會創建一個全新的執行上下文。
如果創建CL的實例,然后調用分配給構造函數原型的方法,例如:
cl.protoFunc()
那么protoFunc中的 這個將是cl 。
您的聲明:
調用protoFunc之前的函數上下文是CL的上下文
沒道理,大概是在這里您將“上下文”與“ this”混淆了。 如上所述, 這是由調用(或綁定)設置的,因此您必須顯示如何調用CL來確定這將是什么。
如何將函數上下文放入protoFunc
鑒於這在構造函數中的實例和一個函數的這個值是由調用設置:
cl.protoFunc()
會做的工作。
術語“上下文”已潛入的ECMAScript行話作為該化名,這是不幸的。 ECMA-262本質上將執行上下文定義為在輸入函數(或新的全局環境或使用eval)時創建的環境,該環境包括作用域鏈和函數的所有變量(包括其this值)。 您不能引用執行上下文或以任何方式訪問它。
因此,函數的上下文遠不止於此 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.