JavaScript 属性类型分为两种:数据属性和访问器属性。虽然我们在 JavaScript 中不能直接访问它们,但这些属性会被 JavaScript 引擎使用。
为了表示属性是内部值,把它们放在了两对方括号里 [[\\’特性值\\’]] 。
数据属性和访问器属性各自有四个描述行为的特性。
一般我们不需要重新定义这些属性的,它们都有各自的默认值。
-
共用属性(数据属性和访问器属性)
Configurabe => 指能否通过 delete 删除属性从而重新定义属性,能否更改属性的特性,能否把属性修改为「访问器属性」,默认为 true。
Enumerable => 指能否通过 for-in 循环返回属性,默认为 true。
-
数据属性
Writable => 表示能否修改属性的值,默认为 true。
Value => 指属性的数据值,我们访问数据的时候就是从这里获取的值,写入值的时候,也是写入到 Value。
-
访问器属性
Get => 在读取属性的时候调用的函数。默认为 undefined。
Set => 在写入属性的时候调用的函数。默认为 undefined。
如果项目有需求,我们可以使用 Object.defineProperty() 方法,修改属性默认的特性,此属性接收三个参数:属性所在的对象、属性的名字和一个描述符对象。
1、Configurabe
var web = {};
Object.defineProperty(web,\\\'name\\\',{
configurabe:false,
value:\\\'javaScript\\\'
})
console.log(web.name);//输出 javaScript
delete web.name;
console.log(web.name);//输出 javaScript
Configurabe 设置 false 后「delete删除」不生效。
2、Enumerable
var web = {a: 1, b: 2};
Object.defineProperty(web, \\\'c\\\', {
enumerable: false,
value: 3,
});
console.log(web);//输出 {a: 1, b: 2, c: 3}
var webCopy = {};
for( var key in web ){
webCopy[key] = web[key];
}
console.log(webCopy);//输出 {a: 1, b: 2}
Enumerable 设置 false 后「for循环」不会返回属性。
3、Writable
var web = {};
Object.defineProperty(web, \\\'name\\\', {
writable: false,
value: \\\'javaScript\\\',
});
console.log(web.name);//输出 javaScript
web.name = \\\'javaScript-updata\\\'
console.log(web.name);//输出 javaScript
Writable 设置 false 后,属性值不可写入。
4、Get
var web = {
_text:\\\'javaScript\\\'
};
Object.defineProperty(web,\\\"text\\\",{
get:function () {
console.log(this._text);
}
});
web.text;//输出 javaScript
Get 定义了方法,返回 web._text 的值,web.text 不可修改,只能读取。
5、Set
var web = {
_text:\\\'javaScript\\\'
};
Object.defineProperty(web,\\\"text\\\",{
get:function () {
console.log(this._text);
},
set:function(newvalue){
if( newvalue === \\\'javaScript\\\' ){
this._text = \\\'javaScript-updata\\\';
}
}
});
//条件一
web.text = \\\'javaScript\\\';
web.text;//输出 javaScript-updata
//条件一 结束
//条件二
web.text = \\\'javaScript-dont-set\\\';
web.text;//输出 javaScript
//条件二 结束
如果设置了 Set 方法,在赋值的时候就会走方法。web.text 赋值后,进入 if 判断 newvalue === \\’javaScript\\’ ,如果为 true ,就去修改 web._text 的值,然后由 Get 返回数据。
数据属性的 Writable、Value 和 访问器属性的 Get、Set 不可同时设置。Writable、Value存在的时候,Get、Set不能存在。
在属性设置的时候,你设置了哪些参数,也就相当于设定了它们属于哪种类型。
参考资料
《javaScript 高级程序设计》
原创文章,作者:小道研究,如若转载,请注明出处:https://www.sudun.com/ask/34616.html