function defineProperty(person, key, val) {
  Object.defineProperty(person, key, {
    get: function () {
      return val
    },
    set: function (newVal) {
      if (val !== newVal) {
        val = newVal;
        _render(ul);
      };
    }
  })
}

for (let key in person) {
  defineProperty(person, key, person[key])
}

inp.oninput = function () {
  person.weight = inp.value
}

此处最需要注意的是直接使用Object.defineproperty设置监听对象是get()的栈溢出问题,使用闭包处理一下即可

ps:严格来说还需要判断下person的是否为对象,此处没作处理