首页 > 其他分享 >前端歌谣的刷题之路-第一百零五题-监听对象

前端歌谣的刷题之路-第一百零五题-监听对象

时间:2023-11-28 10:06:23浏览次数:42  
标签:target render 对象 person 一百零五 key 属性 监听 刷题


 

前言

我是歌谣 我有个兄弟 巅峰的时候排名c站总榜19 叫前端小歌谣 曾经我花了三年的时间创作了他 现在我要用五年的时间超越他 今天又是接近兄弟的一天人生难免坎坷 大不了从头再来 歌谣的意志是永恒的 放弃很容易 但是坚持一定很酷 本题目源自于牛客网 微信公众号前端小歌谣

题目

请补全JavaScript代码,要求如下:
1. 监听对象属性的变化
2. 当"person"对象的属性发生变化时,页面中与该属性相关的数据同步更新
注意:
1. 必须使用Object.defineProperty实现且触发set方法时更新视图
2. 可以使用预设代码"_render"函数

前端歌谣的刷题之路-第一百零五题-监听对象_html

前端歌谣的刷题之路-第一百零五题-监听对象_属性值_02编辑

 核心代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>监听对象</title>
</head>
<style>
  ul {
      list-style: none;
  }
</style>
<body>
  <ul></ul>
  <script>
    var ul = document.querySelector('ul');
    var person = {
      sex: '男',
      age: '25',
      name: '王大锤',
      height: 28,
      weight: 32
    };
    const _render = element => {
      var str = `<li>姓名:<span>${person.name}</span></li>
                   <li>性别:<span>${person.sex}</span></li>
                   <li>年龄:<span>${person.age}</span></li>
                   <li>身高:<span>${person.height}</span></li>
                   <li>体重:<span>${person.weight}</span></li>`
      element.innerHTML = str;
    }
    _render(ul);
    // 补全代码
    function Observe(target) {
      if (typeof target !== 'object' || target == null) {
        return target
      }
      for (var key in target) {
        defineReactive(target, key, target[key])
      }
    }

    function defineReactive(target, key, value) {
      Object.defineProperty(target, key, {
        get: function () {
          return value
        },
        set: function (newVal) {
          if (newVal !== value) {
            value = newVal
            _render(ul)
          }

        }

      })
    }
    Observe(person)
  </script>
</body>

</html>

前端歌谣的刷题之路-第一百零五题-监听对象_补全_03

总结

创建”Observe“函数,接收一个对象参数,首先判断该对象参数是否合法,之后通过遍历对象的所有属性进行拦截操作。尽管可以直接使用Object.defineProperty函数对”person“对象进行拦截,但是可以通过创建”Observe“函数来封装对某个对象的属性劫持功能,之后可以复用此函数。创建“defineReactive”函数,接收三个参数分别为该对象、对象属性、对象属性值。该函数内部使用Object.defineProperty函数对该对象的属性值进行拦截,且每当触发set时,调用”render“方法重新渲染视图


标签:target,render,对象,person,一百零五,key,属性,监听,刷题
From: https://blog.51cto.com/u_14476028/8595218

相关文章

  • Flutter 利用路由监听页面的展示与否
    1、新建routeObser.dart文件:import'package:flutter/material.dart';classAppRouteObserver{//这是实际上的路由监听器staticfinalRouteObserver<ModalRoute<void>>_routeObserver=RouteObserver<ModalRoute<void>>();//这是个单例......
  • vue中的watch监听器
    方法一:当监听某一属性的变化时,建议直接使用函数写法constvm=newVue({el:'#app',data:{username:''},watch:{username(newVal,oldVal){console.log(newVal,oldVal)}}}) 方法二:当页面初始化需要监听一......
  • Vue中自定义组件监听事件传参
    自定义数字框组件如下<template><divclass="count-box"><button@click="handleSub"class="minus">-</button><input:value="value"@change="handleChange"class="inp"typ......
  • 前端歌谣的刷题之路-第一百题-控制动画
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 前端歌谣的刷题之路-第一百零二题-全选
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 前端歌谣的刷题之路-第一百零三题-回文字符串
     前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷本题目源自于牛客网微信公众号前端小歌谣题目......
  • 刷题复习(一)链表
    刷题复习(一)链表https://labuladong.gitee.io/algo/di-ling-zh-bfe1b/shuang-zhi-0f7cc/1、合并两个有序链表思路清晰,双链表有个根节点记录开头/***Definitionforsingly-linkedlist.*publicclassListNode{*intval;*ListNodenext;*ListNode(){}*Lis......
  • 【SpringBoot应用篇】SpringBoot: 事件的发布和监听
    【SpringBoot应用篇】SpringBoot:事件的发布和监听应用场景概述自定义事件发布和监听pom自定义事件源和实体发布事件监听类使用ApplicationListener方式监听类使用@EventListener方式Spring事件最佳实践通用泛型类事件发布事件类事件监听类异步监听处理事......
  • 【刷题记录】20231124 线段树分治
    做题记录:注意到每次相当于\(0\)后面加\(1\),\(1\)后面加\(0\),因此每次可以合并01和10然后将问题规模减半。黑白染色,白格子=lcm+1,黑格子=prime相乘。发现横着竖着有六个质数,斜着只用四个质数。调整一下顺序即可。状压DP。考虑S作为前缀max时S与U-S的排列方案数。S每......
  • 力扣刷题随笔
    力扣刷题随笔回文链表给你一个单链表的头节点head,请你判断该链表是否为回文链表。如果是,返回true;否则,返回false输入:head=[1,2,2,1]输出:true输入:head=[1,2]输出:false链表中节点数目在范围[1,105]内0<=Node.val<=9本题的思路就是利用双指针的方法来比......