是否可以访问 Javascript 中的私有范围变量或方法?
Is it possible to access to private scoped variables or methods in Javascript?
我有一个第三方库公开了一个指向私有方法的 public 方法。
const thirdPartyLibrary = function(){
function privateFunction() {
return superSecretFunction();
};
function superSecretFunction() {
return Math.random();
};
// library public api
return {
publicMethod:() => { return privateFunction() }
}
}();
我在示例中对其进行了一些简化,但它有点像模块模式的实现。
我想知道是否有可能以某种方式访问这些私有方法以改变它们的行为或至少公开它们。
我已尝试访问 this
,但正如预期的那样,未列出私有方法。
thirdPartyLibrary.foo = function(){console.log(this)};
thirdPartyLibrary.foo() // private members not listed
显然,我无法更改库的代码:)
不,这是不可能的。闭包作用域变量确实是私有的。
您所能做的就是访问(并覆盖)thirdPartyLibrary
对象的方法,该对象由“库 public api" 对象字面量。这意味着如果需要,您可以用您自己的版本完全替换整个库,但您无法访问其内部结构1.
1: 一些库不小心泄漏了它们的内部结构,例如通过使用内部调用回调作为 this
上下文,但这是模块实现中的错误。
我有一个第三方库公开了一个指向私有方法的 public 方法。
const thirdPartyLibrary = function(){
function privateFunction() {
return superSecretFunction();
};
function superSecretFunction() {
return Math.random();
};
// library public api
return {
publicMethod:() => { return privateFunction() }
}
}();
我在示例中对其进行了一些简化,但它有点像模块模式的实现。
我想知道是否有可能以某种方式访问这些私有方法以改变它们的行为或至少公开它们。
我已尝试访问 this
,但正如预期的那样,未列出私有方法。
thirdPartyLibrary.foo = function(){console.log(this)};
thirdPartyLibrary.foo() // private members not listed
显然,我无法更改库的代码:)
不,这是不可能的。闭包作用域变量确实是私有的。
您所能做的就是访问(并覆盖)thirdPartyLibrary
对象的方法,该对象由“库 public api" 对象字面量。这意味着如果需要,您可以用您自己的版本完全替换整个库,但您无法访问其内部结构1.
1: 一些库不小心泄漏了它们的内部结构,例如通过使用内部调用回调作为 this
上下文,但这是模块实现中的错误。