如何解决可以调用 javascript 嵌套函数 new fun1().fun2().fun3()
这是我的原始函数
function fun1(){
this.fun2 = function(){
this.fun3 = function(){
}
}
}
new fun1().fun2()
它工作正常,但是当我使用
new fun1().fun2().fun3()
它不起作用。我需要像
这样的嵌套函数调用 new fun1().fun2().fun3()
解决方法
您以构造函数的形式编写了 fun1
和 fun2
(使用 this
,不返回值)。如果使用 new
关键字调用构造函数,则会生成一个新对象。
因此,new fun1()
返回一个具有 .fun2
的对象。但是 obj.fun2()
返回 undefined
,因为它没有 return
,并且没有使用 new
,这就是您的 .fun3
调用不起作用的原因。您需要编写以下内容之一:
new (new fun1().fun2)().fun3() // if `fun3` is a function
new (new (new fun1().fun2)().fun3)() // if `fun3` is a constructor
在您的场景中执行 fun3
。正如 Rory 所说,这段代码几乎肯定是个坏主意。
为了使链式 new fun1().fun2().fun3()
起作用,fun1
应该是一个构造函数,它创建一个具有 fun2
方法的对象,它返回一个具有 fun3
方法的对象。一个明显的场景是当这些对象是同一个对象时,但不一定如此。您的链接代码可以工作的最简单的场景是
class fun1 {
fun2() {
return this;
}
fun3() {
}
}
或等效
function fun1() {
}
fun1.prototype = {
fun2: function fun2() {
return this;
},fun3: function fun3() {
},};
或者几乎但不完全等效:
function fun1() {
this.fun2 = function fun2() {
return this;
}
this.fun3 = function fun3() {
}
}
你也可以这样写,让两个中间对象不同:
class Other {
fun3() {
}
}
class fun1 {
fun2() {
return new Other();
}
}
(或等效或几乎等效的代码)
另请注意,构造函数通常使用 TitleCase 命名;这会通知阅读代码的程序员应该如何使用它。因此,Fun1
应该比 fun1
更受欢迎——尽管这样做也不是错误。
(注意,我说的是构造函数和函数之间的区别;实际上,没有区别。我只是将其写为“以期望将其作为构造函数执行的方式编写的函数”的快捷方式”,和“一个函数,它应该作为一个普通函数被调用”。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。