vue实现动态数据绑定
实现的步骤: 1.监听对象属性的读取与变化Object.defineProperty() 方法会直接在对象上定义一个新的的属性,或者已经存在的属性并且返回这个属性 语法是 Object.defineProperty(obj,prop,descript) obj: 目标对象 prop: 需要定义或修改的属性的名字 descript: 将被定义或修改的属性的描述符 描述:这个方法精确添加或修改对象的属性,我们添加的属性是可以枚举的属性(Object.keys()/ for...in) 对象里面存在是属性描述存在的形式是: 数据描述符:拥有可写入或不可以写入的属性(相当于口令密码) 存取描述符:由一对getter-setter 函数功能来描述的属性(方法) 注意:**描述符**必须是两种形式之一,不能同时是两者。 数据描述符和存取描述符均具有以下可选键值: 1.configurable:当且仅当该属性的 configurable 为 true 时,该属性描述符才能够被改变,也能够被删除。默认为 false 2.enumerable:当且仅当该属性的 enumerable 为 true 时,该属性才能够出现在对象的枚举属性中。默认为 false 数据描述符: 1.value:该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为 undefined。 2.writable:当且仅当该属性的 writable 为 true 时,该属性才能被赋值运算符改变。默认为 false。 存取描述符同时具有以下可选键值: 1.get:一个给属性提供 getter 的方法,如果没有 getter 则为 undefined。该方法返回值被用作属性值。默认为 undefined。 2.set:一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined。 示例:创建属性console.log(o.a);
Object.defineProperty(o,"b",{get : function(){ /console.log( bValue)/ return value },set : function(newValue){ bValue = newValue; },configurable : true}); o.b = 38; 修改属性当属性特性(property attribute) writable 设置为false时,表示 non-writable,属性不能被修改。 Object.defineProperty(o,{ value : 37,writable : false });
console.log(o.a); // 打印 37 一般的setter 和 getters// 'I alway return this string,whatever you have assigned'
console.log(instance.myproperty); // 'this is my name string' console.log(instance.myname); 解题Observer.prototype.recursion = function(obj) {
var val = null; for (key in obj) { if(obj.hasOwnProperty(key)) { val = obj[val]; if(typeof val === 'object' && !!val) { new Observer(val); } this.access(key,val); } } } Observer.prototype.access = function(key,val) { let app1 = new Observer({ // 要实现的结果如下: 多层级对象当传入的对象是 递归解决问题!!Observer.prototype.recursion = function(obj) {
var val = null; for (key in obj) { if(obj.hasOwnProperty(key)) { val = obj[key]; if(typeof val === 'object' && !!val) { new Observer(val); } this.access(key,set: function (newVal) { console.log('你设置了' + key); console.log('新的' + key + ' = ' + newVal) if (newVal === val) return; val = newVal } }) } let app1 = new Observer({ app1.data.user.name // 你访问了 name 增加事件系统Event.prototype.emit = function(attr,val,newVal) {
this.events[attr] && this.events[attr].forEach(function(item){ item(val,newVal) }) } Event.prototype.on = function(attr,callback){ function Observer(data) { Observer.prototype.recursion = function(obj) { let app1 = new Observer({ app1.data.user.name // 你访问了 name app1.data.user.name = { app1.$watch('age',function(oldVal,newVal){ app1.$watch('age',newVal){ app1.data.age = 20; 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程之家。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |