封装的这个freezePolyfill用递归要怎么做?

封装的这个freezePolyfill用递归要怎么做?

封装的这个freezePolyfill用递归要怎么做?写不来,老师指导下



自己改了下,但感觉只对对象有效,遇到数组和函数应该就没用了

Object.defineProperty(Object, 'freezePolyfill', {
    value: function (obj) {
        var i;
        for (i in obj) {
            if (obj.hasOwnProperty(i)) {
                if (typeof obj[i] === 'object') {
                    Object.freezePolyfill(obj[i]);
                } else {
                    Object.defineProperty(obj, i, {
                        writable: false
                    });
                }
            }
        }
        Object.seal(obj);
    }
});​

正在回答

登陆购买课程后可参与讨论,去登陆

2回答

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

  1. 同学粘贴的这段代码,使用的就是递归实现的效果呀,如下图所示:当判断属性的类型是对象时,就再次调用封装的freezePolyfill方法

    http://img1.sycdn.imooc.com//climg/5fd824f9097d40d509580642.jpg

  2. 老师测试同学的代码,效果实现是对的,对象下的数组和对象中的属性都不可以被修改,示例:

    http://img1.sycdn.imooc.com//climg/5fd825f50917adee07370813.jpg

    修改之前和之后输出的对象o的结果是一样的,无法修改他的值。

    http://img1.sycdn.imooc.com//climg/5fd8261509351e8409740564.jpg

祝学习愉快~

  • 人生的起源 提问者 #1

    我记得以前课程有说过,什么情况下,数组,函数,对象的类型会都显示为对象,好像要用什么新的方法才能让它们显示出具体的类型,老师能再说下吗?


    遇到这种情况,封装的这个方法对数组和函数是不是就无效了?

    2020-12-15 12:08:26
好帮手慕慕子 2020-12-15 18:42:31

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

  1. 老师测试同学封装的代码,针对数组也是有效的。示例:

    http://img1.sycdn.imooc.com//climg/5fd88f5309febc1005240322.jpg

    数组里面的内容是可以被修改的。如下图所示:

    http://img1.sycdn.imooc.com//climg/5fd88f5c091099e106570409.jpg

  2. 因为函数主要是针对实现某一个功能,无法修改它的函数体,所以这个封装可以不用考虑函数。

  3. 使用typeof检测符进行检测,数组和对象返回的结果都是object,函数返回的结果是function,一般推荐使用Object.prototype.toString.call(要检测的元素)这种方式检测具体的数据类型,示例:

    http://img1.sycdn.imooc.com//climg/5fd892eb098d6fdc12060396.jpg

    http://img1.sycdn.imooc.com//climg/5fd892f30938128606540294.jpg

祝学习愉快~

  • 提问者 人生的起源 #1

    老师说的这种方法,返回的是[object Array]、[object Object]和[object Function],如果放到if语句里面要怎么判断呢?


    比如判断某个数据类型是不是数组,是不是要先循环[object Array],看下里面有没Array,还是有更好的办法?感觉好麻烦

    2020-12-15 19:10:31
  • 好帮手慕慕子 回复 提问者 人生的起源 #2

    同学你好, 如果放到if语句中,直接对返回的结果进行判断即可。

    不用的,可以先定义一个变量接收检测的结果,然后再对检测的结果进行判断。以同学的代码为例,可以参考下图代码修改

    http://img1.sycdn.imooc.com//climg/5fd9644509befbce09630543.jpg

    ​这里只需要针对数组和对象进行处理,同学最开始粘贴的代码,实现的效果就是对的,直接使用typeof操作符进行检测就可以了。

    老师提供给同学的这种检测数据类型的方式,同学了解下即可,如果以后遇到了需要精确的检测数据类型时,再使用这种方式,灵活运用所学知识去实现效果。

    祝学习愉快~

    2020-12-16 09:42:48
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
热门框架Vue开发WebApp 18版
  • 参与学习           人
  • 提交作业       209    份
  • 解答问题       3299    个

本路径是通过ES6基础知识、运用Zepto、Swiper、fullPag等移动端常用工具包、以及当下流行框架Vue,结合多个实战案例,还原真实开发场景,最终实现手机端购物商城网页开发。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师