前言
平常添加对象的自定义方法或者属性,都是直接无法监听成功还是失败,一般是知道添加的属性或者方法都是明确。这个东西还能做双向绑定了。
Reflect.defineProperty() 与 Object.defineProperty()
两个是一样的,都是直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。唯一不同在于返回 Boolean 值。
Reflect.defineProperty()
Reflect 是一个内置的对象,它提供拦截 JavaScript 操作的方法。defineProperty()这个是静态方法。允许精确添加或修改对象上的属性。IE和欧朋不支持。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect/defineProperty
语法
Reflect.defineProperty(target, propertyKey, attributes);
// 参数说明
/*
target:要被添加属性的目标对象。
propertyKey:要定义或修改的属性的名称。
attributes:要定义或修改的属性的描述。value是固定的,需改或者添加属性的值。
*/
// 返回值
// 返回的类型是Boolean 值。是指示了属性是否被成功定义。
如果目标不是 Object,抛出一个 TypeError。
案例
添加或者修改对象方法。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
// 1、定义一个空的对象。
var obj = {};
// 2、将空的对象修改或者添加属性name。
var ss = Reflect.defineProperty(obj,"name",{value:"我是现在name属性的值"}); // 还可以这摸写:var ss = Reflect.defineProperty(obj,["name"],{value:"我是现在name属性的值"}); 第二个参数可以填数组,但是只能选择第一个。
// 3、打印出 obj的对象的name值。
console.log(obj.name);
// 4、Reflect.defineProperty方法返回布尔值,可以知道是否知道属性或者方法添加成功
if(ss){
// 添加或修改成功,返回为真
console.log("添加或者修改成功");
}else {
// 修改失败后,返回为假
console.log("失败");
}
</script>
</body>
</html>
注意
既然是obj对象的话,
// 对象有:函数、数组、json、new Object()
var obj = function () {};
var ss = Reflect.defineProperty(obj,"name",{value:"我是现在name属性的值"});
console.dir(ss.name);