老师,请问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回答

好帮手慕久久

2020-09-04

同学你好,这个例子中的 fn1,也算是一个对象封装(说成函数封装更准确些),通常情况下,普通的函数封装,不会使用new关键字来调用,即调用时,直接写成“fn1()”即可,所以同学举得这个例子,有点鸡肋,没啥实际意义,同学了解一下即可。

函数封装,可以通过返回一个对象,实现返回多个值的目的,如下:

http://img.mukewang.com/climg/5f51e5600948e64a05750387.jpg

同学可以敲一下代码,看看效果。

祝学习愉快!

0

慕村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是嘛

0

慕村7413894

提问者

2020-09-04

好的,那这种情况是不是属于对象封装的,对象封装的话,可以有多个返回值嘛

0

好帮手慕久久

2020-09-04

同学你好,问题解答如下:

这是因为构造函数fn1中,使用了return关键字返回了fn2,所以实例化fn1后,得到的是fn2,而不再是fn1实例化应该返回的那个实例,如下:

使用return返回时:

http://img.mukewang.com/climg/5f51d3f909c6584e05540317.jpg

正常实例化时:

http://img.mukewang.com/climg/5f51d45609df5fe908310312.jpg

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

http://img.mukewang.com/climg/5f51d40c098be90d05540269.jpg

由于fn2上没有fn2和sub这两个方法,所以后两个调用会报错,而直接调用test会打印1。

如果我的回答帮到了你,欢迎采纳,祝学习愉快!

0

0 学习 · 14456 问题

查看课程