老师,请问fn1方法里的a和fn2方法,为什么在test实例化之后报错
来源:5-3 选择练习
慕村7413894
2020-09-04 11:52:26
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function fn1(){
var a=1;
function fn2(){
return a;
}
this.sub=function(){
return fn2;
}
return fn2
}
var test=new fn1();
console.log(test());//1
console.log(test.fn2());//test.fn2 is not a function
console.log(test.sub()());//Uncaught TypeError: test.sub is not a function
</script>
</head>
<body>
</body>
</html>
实例化fn1之后,使用实例化的fn1的对象直接带()就可以访问a,但是访问fn1下的fn2()和sub()函数就报错
4回答
同学你好,这个例子中的 fn1,也算是一个对象封装(说成函数封装更准确些),通常情况下,普通的函数封装,不会使用new关键字来调用,即调用时,直接写成“fn1()”即可,所以同学举得这个例子,有点鸡肋,没啥实际意义,同学了解一下即可。
函数封装,可以通过返回一个对象,实现返回多个值的目的,如下:

同学可以敲一下代码,看看效果。
祝学习愉快!
慕村7413894
提问者
2020-09-04
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script>
function test(){
var num=1;
function A(){
return num;
}
this.subTest=function(){
return A;
}
return subTest
}
var obj=new test();
console.log(obj)
</script>
</head>
<body>
</body>
</html>不好意思了,还得麻烦问下了,这个用new实例化就提示报错,不用new实例化就可以正常输出,问一下使用new实例化构造函数的方式是不能返回subTest是嘛
慕村7413894
提问者
2020-09-04
好的,那这种情况是不是属于对象封装的,对象封装的话,可以有多个返回值嘛
好帮手慕久久
2020-09-04
同学你好,问题解答如下:
这是因为构造函数fn1中,使用了return关键字返回了fn2,所以实例化fn1后,得到的是fn2,而不再是fn1实例化应该返回的那个实例,如下:
使用return返回时:

正常实例化时:

因此,在同学这个例子中,得到的test实际上是fn2,如下:

由于fn2上没有fn2和sub这两个方法,所以后两个调用会报错,而直接调用test会打印1。
如果我的回答帮到了你,欢迎采纳,祝学习愉快!
相似问题