码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 闭包问题优化


    文章目录

        • 1、闭包基本实现
        • 2、问题简述
        • 3、优化
          • 3.1 空原型链或
          • 3.2 限定key范围

    1、闭包基本实现

    /**
     * 让外部方法使用内部局部变量,防止全局变量被污染;
     * 但仅限于使用,不建议对局部变量进行修改
     */
    const obj = function() {
      let o = {
        name: "zhangsan",
        age: "18"
      }
      return function (key) {
        return o[key];
      }
    } ()
    
    console.log(obj("age"));      // 18
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    2、问题简述

    上述方式并不能完全实现闭包,可以通过原型链拿取对象信息并加以修改

    // 在原型上添加方法,获取当前对象,并能修改对象内部name属性的值
    Object.defineProperty(Object.prototype,'getAll', {
      // 访问该属性时,将不带参地调用此函数,**并将 this 设置为通过该属性访问的对象**
      get() {
        return this;
      },
      // 当该属性被赋值时,将调用此函数,并带有一个参数(要赋给该属性的值)
      // **并将 this 设置为通过该属性分配的对象**
      set(value) {
        this["name"] = value;
      }
    })
    
    // 获取对象信息
    console.log(obj("getAll"));  // { name: 'zhangsan', age: '18' }
    // 修改对象内容
    obj("getAll").getAll = "lisi";
    console.log(obj("getAll"));  // { name: 'lisi', age: '18' }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    3、优化

    3.1 空原型链或
    const obj = function() {
      // 指定原型链为null(参数只能为 null 或 Object)
      let o = Object.create(null);
      o.name = "zhangsan",
      o.age = "18";
      return function (key) {
        return o[key];
      }
    } ()
    
    // 验证原型链
    Object.defineProperty(Object.prototype,'getAll', {
      get() {
        return this;
      }
    })
    console.log(obj("getAll"));  // undefined
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    3.2 限定key范围
    const obj = function() {
      let o = {
        name: "zhangsan",
        age: "18"
      }
      return function (key) {
        // 判断是否是对象自有属性,非继承属性;可用 Object.hasOwn(对象名,属性名) 代替
        if(o.hasOwnProperty(key)) {
          return o[key];
        }
        throw new Error("key is not exist!")
      }
    } ()
    // 验证原型链
    Object.defineProperty(Object.prototype,'getAll', {
      get() {
        return this;
      },
    })
    
    console.log(obj("getAll"));  // Error: key is not exist!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    PS. Object.hasOwn() 旨在取代 Object.prototype.hasOwnProperty()。

  • 相关阅读:
    C++设计模式之单例模式、模板模式、状态模式、原型模式、CRTP 模式、组件模式、观察者模式、发布-订阅模式、访问者模式
    登录业务实现(单点登录+微信扫码+短信服务)
    分布式监控系统——Zabbix(2)部署
    java8-使用流-2
    软考 - 数据库
    依赖倒置原则(Dependence Inversion Principle)
    小程序支付详解
    【HCIA】FTP & DHCP
    玩机搞机---卸载内置软件 无root权限卸载不需要的软件 安全卸载
    springboot罗亚方舟考研资料库网站设计与实现 毕业设计-附源码302302
  • 原文地址:https://blog.csdn.net/qq_44708990/article/details/134410254
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号