在 class 内的函数内创建函数
Creating a function inside a function inside a class
假设我有一些 class,里面有一些功能:
var someClass = class someClass() {
constructor() {}
someFunction(someObj)
{
function anotherFunction() {
return JSON.stringify(someObj, null, 2);
}
return someObj;
}
}
在这种情况下,我可以调用 someClass.someFunction(someObj)
,它会 return [object Object]
。在尝试调用 someClass.someFunction(someObj).anotherFunction()
时,它会出现 TypeError: someClass.someFunction(...).anotherFunction is not a function
.
我该如何避免这种情况?我尝试创建一个像 someClass.prototype.someFunction.anotherFunction = function() {...}
这样的原型,但这不起作用。
非常感谢,
@Medallon.
someClass.someFunction(...).anotherFunction
不是 引用 someFunction
的 "inner" 函数;相反,它指的是 someFunction
编辑的对象上的函数 anotherFunction
。因此,您需要 return 一些具有 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,
};
}
}
您正在创建一个函数 (anotherFunction
),但从未对其进行任何操作。 JavaScript 引擎可能会完全优化它。
如果您希望它可以在 someFunction
之外访问,您需要做一些事情以使其在 someFunction
之外可以访问。你可能 return 它。或 return 一个具有 属性 的对象。或者将其添加为 属性 到 someObj
(尽管这并不常见)。
例如,这里我们 return 一个新对象,上面同时包含函数和原始 someObj
(因为您出于某种原因 return 使用它):
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() {
.
之后你不应该有 ()
如果变量名称和 class 名称相同,则 var someClass =
部分毫无意义。如果它们不同,至少使用 let
这样变量的提升与 class 的提升相同(例如,它只是半提升)。
压倒性的 JavaScript 中的约定是构造函数以大写字母开头;所以 SomeClass
,而不是 someClass
。虽然您可以在自己的代码中使用任何您喜欢的约定,但我强烈建议您使用这个约定,它有助于人们阅读您的代码。最起码问问题的时候要照着做。
假设我有一些 class,里面有一些功能:
var someClass = class someClass() {
constructor() {}
someFunction(someObj)
{
function anotherFunction() {
return JSON.stringify(someObj, null, 2);
}
return someObj;
}
}
在这种情况下,我可以调用 someClass.someFunction(someObj)
,它会 return [object Object]
。在尝试调用 someClass.someFunction(someObj).anotherFunction()
时,它会出现 TypeError: someClass.someFunction(...).anotherFunction is not a function
.
我该如何避免这种情况?我尝试创建一个像 someClass.prototype.someFunction.anotherFunction = function() {...}
这样的原型,但这不起作用。
非常感谢, @Medallon.
someClass.someFunction(...).anotherFunction
不是 引用 someFunction
的 "inner" 函数;相反,它指的是 someFunction
编辑的对象上的函数 anotherFunction
。因此,您需要 return 一些具有 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,
};
}
}
您正在创建一个函数 (anotherFunction
),但从未对其进行任何操作。 JavaScript 引擎可能会完全优化它。
如果您希望它可以在 someFunction
之外访问,您需要做一些事情以使其在 someFunction
之外可以访问。你可能 return 它。或 return 一个具有 属性 的对象。或者将其添加为 属性 到 someObj
(尽管这并不常见)。
例如,这里我们 return 一个新对象,上面同时包含函数和原始 someObj
(因为您出于某种原因 return 使用它):
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() {
. 之后你不应该有 如果变量名称和 class 名称相同,则
var someClass =
部分毫无意义。如果它们不同,至少使用let
这样变量的提升与 class 的提升相同(例如,它只是半提升)。压倒性的 JavaScript 中的约定是构造函数以大写字母开头;所以
SomeClass
,而不是someClass
。虽然您可以在自己的代码中使用任何您喜欢的约定,但我强烈建议您使用这个约定,它有助于人们阅读您的代码。最起码问问题的时候要照着做。
()