const object1 = {};
Object.defineProperty(object1, "property1", {
value: 42,
writable: false,
});
object1.property1 = 77; // throws an error in strict mode
console.log(object1.property1); // 42
Object.defineProperty(obj, prop, descriptor);
/**
* 响应式 - 数据变了会通知更新视图
*/
function updateView() {
console.log("更新视图");
}
let oldArrayPrototype = Array.prototype;
let proto = Object.create(oldArrayPrototype);
// 重写部分能直接修改原数组的方法
["push", "shift", "pop", "unshift", "splice"].forEach((method) => {
proto[method] = function () {
// 改写方法,但是还是要调用老的方法实现功能
updateView();
oldArrayPrototype[method].call(this, ...arguments);
};
});
/**
* 声明一个观察者
*/
function observer(target) {
if (typeof target !== "object" || target == null) {
return target;
}
if (Array.isArray(target)) {
// 拦截数组,给数组的原型方法
target.__proto__ = proto;
}
for (const key in target) {
if (target.hasOwnProperty(key)) {
defineReactive(target, key, target[key]);
}
}
}
/**
* 定义一个响应式方法
*/
function defineReactive(target, key, value) {
observer(value);
Object.defineProperty(target, key, {
get() {
console.log("get value===", value);
return value;
},
set(newValue) {
if (newValue !== value) {
updateView();
console.log("set value===", newValue);
value = newValue;
}
},
});
}
let data = {
name: "frank",
age: 20,
otherInfo: {
sex: "male",
},
clothes: ["shirt", "pants", "shoes"],
frends: [
{ name: "link", age: 22 },
{ name: "lottery", age: 19 },
],
};
// 开始观察
observer(data);
data.age += 1;
// get value=== 20
// 更新视图
// set value=== 21
data.otherInfo.sex = "m";
// get value=== {}
// 更新视图
// set value=== m
data.clothes.unshift("hat");
// get value=== (3) [(...), (...), (...)]
// get value=== shirt
// get value=== pants
// get value=== shoes
// 更新视图
// get value=== shoes
// get value=== pants
// 更新视图
// set value=== pants
// get value=== shirt
// 更新视图
// set value=== shirt
// 更新视图
// set value=== hat
data.clothes.shift();
// get value=== (4) [(...), (...), (...), "shoes"]
// get value=== hat
// get value=== shirt
// get value=== pants
// 更新视图
// get value=== hat
// get value=== shirt
// 更新视图
// set value=== shirt
// get value=== pants
// 更新视图
// set value=== pants
// 更新视图
// set value=== shoes
data.frends.push("json");
// get value=== (2) [(...), (...)]
// get value=== {}
// get value=== {}
// 更新视图
data.frends.pop();
// get value=== (3) [(...), (...), "json"]
// get value=== {}
// get value=== {}
// 更新视图
原文:https://www.cnblogs.com/frank-link/p/14811480.html