object.defineproperty 实现双向绑定

复制代码
<script>

    /* ***** get/set存取器描述对象属性 ******
    注意:当使用了getter或setter方法,不允许使用writable和value这两个属性
    注意:get或set不是必须成对出现,任写其一就可以。如果不设置方法,则get和set的默认值为undefined
        configurable和enumerable同上面的用法。
        在ie8下只能在DOM对象上使用,尝试在原生的对象使用 Object.defineProperty()会报错。
     configurable: false, // 不可删除
*/ var obj = {a:1,b:2}; var initValue = 'hello'; Object.defineProperty(obj,"a",{ get:function (){ //当获取值的时候触发的函数 var initValue = "波多野结衣"; return initValue; }, set:function (value){ //当设置值的时候触发的函数,设置的新值通过参数value拿到 initValue = value; } }); //获取值 console.log( obj.a ); //波多野结衣 //设置值 obj.newKey = 'change value'; console.log( obj.newKey ); //change value </script>
复制代码

 

>>>>> 手写双向数据绑定,从视图到模型 (view => model) 与 从模型到视图,仅且都只是利用了一个set方法 来达到目的。

复制代码
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>双向绑定</title>
</head>
<body>
  <input type="text" id="model"><br/>
  <div id="modelText"></div>
</body>
<script>
  var model = document.querySelector("#model");
  var modelText = document.querySelector("#modelText");
  var defaultName = "defaultName";
  var userInfo = {}
  model.value = defaultName;
  Object.defineProperty(userInfo, "name", {
    get: function () {
      return defaultName;
    },
    set: function (value) {
      defaultName = value;
      model.value = value;
      console.log("-----value");
      console.log(value);
      modelText.textContent = value;
    }
  })
 
  userInfo.name = "new value";
  var isEnd = true;
 
  model.addEventListener("keyup", function () {
    if (isEnd) {
      userInfo.name = this.value;
    }
  }, false)
  //加入监听中文输入事件
  model.addEventListener("compositionstart", function () {
    console.log("开始输入中文");
    isEnd = false;
  })
  model.addEventListener("compositionupdate", function () {
    console.log("输入中文中...");
    isEnd = false;
  })
  model.addEventListener("compositionend", function () {
    isEnd = true;
    console.log("结束输入中文");
  })
</script>
</html>
复制代码

 

posted @   expworld  阅读(140)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示