假设我有一些内部有一些功能的课程:
var someClass = class someClass() {
constructor() {}
someFunction(someObj)
{
function anotherFunction() {
return JSON.stringify(someObj, null, 2);
}
return someObj;
}
}
在这种情况下,我可以致电someClass.someFunction(someObj)
,它会返回[object Object]
。在尝试致电someClass.someFunction(someObj).anotherFunction()
时,会出现TypeError: someClass.someFunction(...).anotherFunction is not a function
。
我怎么能绕过这个?我尝试创建像someClass.prototype.someFunction.anotherFunction = function() {...}
这样的原型,但这不起作用。
非常感谢, @Medallyon。
答案 0 :(得分:1)
someClass.someFunction(...).anotherFunction
不指的是someFunction
的“内部”功能;相反,它引用anotherFunction
返回的对象上的函数someFunction
。因此,您需要返回一些具有anotherFunction
作为成员函数的对象才能工作。
示例:
var someClass = class someClass() {
constructor() {}
someFunction(someObj)
{
function anotherFunction() {
return JSON.stringify(someObj, null, 2);
}
// note the difference here
return {
// anotherFunction is a member function of the return object
anotherFunction: anotherFunction,
};
}
}
答案 1 :(得分:1)
您正在创建一个功能(anotherFunction
)并且从未对其执行任何操作。 JavaScript引擎可能会完全优化它。
如果您希望在someFunction
之外访问它,则需要执行一些操作,以便在someFunction
之外访问它。你可以退货。或者返回将其作为属性的对象。或者将其作为属性添加到someObj
(尽管这很不寻常)。
例如,在这里,我们返回一个包含函数和原始someObj
的新对象(因为您出于某种原因返回了它):
var someClass = class someClass {
constructor() {}
someFunction(someObj) {
function anotherFunction() {
return JSON.stringify(someObj, null, 2);
}
return {
someObj, anotherFunction
};
}
};
var sc = new someClass();
var o = sc.someFunction({
foo: "bar"
});
console.log(o.anotherFunction());

附注:
您的someClass
声明不正确;在()
之后你不应该var someClass = class someClass() {
。
如果变量名和类名相同,则var someClass =
部分无意义。如果他们不同,至少使用let
,因此变量的提升与课程的提升相同(例如,它只是半升)。
JavaScript中的压倒性的约定是指构造函数以大写字母开头;所以SomeClass
,而不是someClass
。虽然您可以在自己喜欢的代码中使用任何约定,但我强烈建议您使用此约定,它可以帮助人们阅读您的代码。至少,在提问时请遵循它。