vue2响应式基础原理(1)

884 阅读1分钟

Object.defineProperty() 是一个 JavaScript 内置的方法,它允许你精确地向一个对象添加或修改一个属性。

	// Object.defineProperty() 是 JavaScript 中的一个方法,用于在一个对象上定义一个新的属性,或者修改一个对象的现有属性,并返回这个对象。
	
	// Object.defineProperty(obj, propertyName, descriptor) 接受三个参数:
	
	// obj:要定义属性的对象。
	// propertyName:要定义或修改的属性的名称或Symbol。
	// descriptor:一个对象,它描述了将被定义或修改的属性。
	// descriptor 对象可以有两种形式:数据描述符和存取描述符。
	
	// 数据描述符:具有值的属性,该值可以是可写的,也可以是不可写的。
	
	// value:属性的值。默认为 undefined。
	// writable:如果为 true,则属性的值可以被重新赋值。默认为 false。
	// enumerable:如果为 true,则属性可以在 for...in 循环和 Object.keys() 方法中被枚举。默认为 false。
	// configurable:如果为 true,则属性的类型、属性描述符以及属性值都可以被改变,并且该属性也可以从相应的对象中被删除。默认为 false。
	// 存取描述符:由 getter-setter 函数对组成的属性。
	
	// get:一个函数,当访问该属性时会被调用。默认为 undefined。
	// set:一个函数,当修改该属性时会被调用。默认为 undefined。
	// 需要注意的是,数据描述符和存取描述符不能同时使用在一个属性上,否则会抛出异常。
            
            
            <div id="app">
		18
	</div>
            //页面部分测试
  
	// 模拟 Vue的data
	let data = {
		msg: '哈哈',
		age: '18',
	}
	this.data = {}
	getDefineProperty()
	function getDefineProperty() {
		Object.defineProperty(this, 'age', {
			get() {
				console.log('执行get')
				return data.age;
			},
			set(newValue) {
				console.log('执行set')
				// 相同数据去除
				if (newValue === data.age) return
				 data.age = newValue
				  document.querySelector('#app').textContent = data.age
			}
		})
	}
	
	console.log(this.age);
	this.age=20
            
           

控制台输入测试

image.png