目的属性描述符,轻松学习

轻松学习 JavaScript(7):对象属性描述符

2018/01/11 · JavaScript
· 目的属性描述符,轻松学习。对象

原稿出处: Dhananjay
Kumar   译文出处:码农网/小峰   

在JavaScript中,你可以如下所示创设一个对象字面量:

var cat = { name: ‘foo’, age: 9 };

1
2
3
4
var cat = {
    name: ‘foo’,
    age: 9
};

乍一看,好像对象cat有字符串和数字值那多个特性。然则,那不单是JavaScript解释器。在ES5中,介绍了性能描述符的定义。在大家继承琢磨属性描述符之前,让大家试着回答多少个问题:

  • 哪些创立只读属性?
  • 如何制订不可胜言的特性?
  • 怎么着使属性不可配置?
  • 什么规定一个性质是不是是只读的?

假使你精晓属性描述符,那么您就足以应对所有这几个题目。

请看上面的代码:

var cat = { name: ‘foo’, age: 9 }; var a =
Object.getOwnPropertyDescriptor(cat, ‘name’); console.log(a);

1
2
3
4
5
6
var cat = {
    name: ‘foo’,
    age: 9
};
var a = Object.getOwnPropertyDescriptor(cat, ‘name’);
console.log(a);

出口将如下所示:

亚洲必赢官网 1

正如您在这里看看的,这么些特性有七个特点:

value保存属性的数量,而writable,enumerable和configurable则描述属性的别的特色。接下来大家将对这一个特色一一讲演。

自在学习 JavaScript——第 7 部分:对象属性描述符,javascript

在JavaScript中,你可以如下所示创制一个目的字面量:

var cat = {
  name: 'foo',
  age: 9
};

乍一看,好像对象cat有字符串和数字值那多个属性。可是,那不仅是JavaScript解释器。在ES5中,介绍了性能描述符的概念。在大家继续探讨属性描述符之前,让大家试着应对多少个问题:

  • 什么创制只读属性?
  • 何以制定不计其数的性能?
  • 什么样使属性不可配置?
  • 怎么着确定一个特性是不是是只读的?

万一您了然属性描述符,那么您就足以回复所有那么些题材。

请看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
var a = Object.getOwnPropertyDescriptor(cat, 'name');
console.log(a);

出口将如下所示:

 
亚洲必赢官网 2
image

亚洲必赢官网 ,正如您在此处看看的,这么些特性有八个特点:

value保存属性的数据,而writable,enumerable和configurable则讲述属性的其他特色。接下来我们将对这个特点一一演讲。

在JavaScript中,你可以如下所示创设一个对象字面量:

在JavaScript中,你能够如下所示创设一个对象字面量:

writable

属性的值是还是不是足以更改是由writable特征决定的。假如writable设置为false,那么属性的值不能够改变,JavaScript将忽略属性值中的任何改动。请看下边的代码:

var cat = { name: ‘foo’, age: 9 }; Object.defineProperty(cat, ‘name’, {
writable: false }); console.log(cat.name); // foo cat.name = “koo”; //
JavaScript will ignore it as writable is set to false
console.log(cat.name); // foo

1
2
3
4
5
6
7
8
var cat = {
    name: ‘foo’,
    age: 9
};
Object.defineProperty(cat, ‘name’, { writable: false });
console.log(cat.name); // foo
cat.name = "koo"; // JavaScript will ignore it as writable is set to false
console.log(cat.name); // foo

你能够行使Object.defineProperty更改writable、enumerable和configurable特征的值。大家稍后会在那篇文章中详尽研商Object.defineProperty,但正如你在地方的代码片段中观望的那样,我们早就将writable属性设置为false,从而改变了name属性的值。JavaScript将忽略重新分配,并且name属性的值将维持为foo。

假诺以从严形式运作代码,那么为了重新分配writable设置为false的属性值,JavaScript将抛出格外。请看下边的代码:

‘use strict’; var cat = { name: ‘foo’, age: 9 };
Object.defineProperty(cat, ‘name’, { writable: false });
console.log(cat.name); // foo cat.name = “koo”; // error

1
2
3
4
5
6
7
8
‘use strict’;
var cat = {
    name: ‘foo’,
    age: 9
};
Object.defineProperty(cat, ‘name’, { writable: false });
console.log(cat.name); // foo
cat.name = "koo"; // error

在那边,JavaScript以严谨形式运作,由此,当您重新分配name属性的值时,JavaScript将抛出更加,如下所示:

亚洲必赢官网 3

那边的不当音讯说,你不可能赋值到只读属性。也就是说,即使属性的writable特征设置为false,那么属性将充当只读属性。

writable

特性的值是或不是可以转移是由writable特征决定的。若是writable设置为false,那么属性的值不可以改变,JavaScript将忽略属性值中的任何改动。请看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { writable: false });
console.log(cat.name); // foo 
cat.name = "koo"; // JavaScript will ignore it as writable is set to false 
console.log(cat.name); // foo

你可以应用Object.defineProperty更改writable、enumerable和configurable特征的值。大家稍后会在那篇文章中详细座谈Object.defineProperty,但正如您在地点的代码片段中观望的那样,大家已经将writable属性设置为false,从而改变了name属性的值。JavaScript将忽略重新分配,并且name属性的值将有限支撑为foo。

借使以严酷方式运作代码,那么为了重新分配writable设置为false的属性值,JavaScript将抛出极度。请看上边的代码:

'use strict';
var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { writable: false });
console.log(cat.name); // foo 
cat.name = "koo"; // error

在此间,JavaScript以严谨格局运作,由此,当你重新分配name属性的值时,JavaScript将抛出非凡,如下所示:

 
亚洲必赢官网 4
image

此间的谬误新闻说,你不可以赋值到只读属性。也就是说,如若属性的writable特征设置为false,那么属性将担任只读属性。

var cat = {
  name: 'foo',
  age: 9
};
var cat = {
  name: 'foo',
  age: 9
};

configurable

特性的其他特色是不是足以安排取决于configurable的值。如果属性configurable设置为false,则不可以改变writable和enumerable的值。请看上边的代码:

var cat = { name: ‘foo’, age: 9 }; Object.defineProperty(cat, ‘name’, {
configurable: false }); Object.defineProperty(cat, ‘name’, { enumerable:
false });

1
2
3
4
5
6
var cat = {
    name: ‘foo’,
    age: 9
};
Object.defineProperty(cat, ‘name’, { configurable: false });
Object.defineProperty(cat, ‘name’, { enumerable: false });

在那边,我们将name属性的configurable设置为false。之后,我们将enumerable设置为false。如前所述,一旦一个特性的configurable设置为false,那么您就不可能改变另一个风味。

对此地方的代码,JavaScript会抛出一个TypeError非凡,如下图所示。你会博得不可以再度定义属性名称的谬误:

亚洲必赢官网 5

在采纳configurable的时候,你须求记住,改变configurable的值只可以做几次。即使将性能的configurable设置为false,那么你就不可以重新分配它;你无法收回对configurable的变动。请看上面的代码:

var cat = { name: ‘foo’, age: 9 }; Object.defineProperty(cat, ‘name’, {
configurable: false }); Object.defineProperty(cat, ‘name’, {
configurable: true });

1
2
3
4
5
6
var cat = {
    name: ‘foo’,
    age: 9
};
Object.defineProperty(cat, ‘name’, { configurable: false });
Object.defineProperty(cat, ‘name’, { configurable: true });

咱俩在重新分配name属性的configurable,但是,JavaScript会对上述操作抛出一个TypeError,如下图所示。正如您所观望标,一旦configurable被安装为false,就不可能收回这些更改。

亚洲必赢官网 6

另一个关键的业务是,尽管configurable设置为false,writable也足以从true更改为false——但反之则不然。请看上边的代码:

var cat = { name: ‘foo’, age: 9 }; Object.defineProperty(cat, ‘name’, {
configurable: false }); Object.defineProperty(cat, ‘name’, { writable:
false }); cat.name = ‘koo’; console.log(cat.name); // foo

1
2
3
4
5
6
7
8
var cat = {
    name: ‘foo’,
    age: 9
};
Object.defineProperty(cat, ‘name’, { configurable: false });
Object.defineProperty(cat, ‘name’, { writable: false });
cat.name = ‘koo’;
console.log(cat.name); // foo

一经不是在从严格局下,下面的代码不会抛出此外至极。正如我辈前边所谈论的,固然configurable为false,writable也得以从true变为false,反之则不然。另一个内需牢记的要紧事项是,你无法删除configurable设置为false的属性。

var cat = { name: ‘foo’, age: 9 }; Object.defineProperty(cat, ‘name’, {
configurable: false }); delete cat.name; // wont delete as configurable
is false console.log(cat.name); // foo delete (cat.age); // will be
deleted console.log(cat.age); // undefined

1
2
3
4
5
6
7
8
9
var cat = {
    name: ‘foo’,
    age: 9
};
Object.defineProperty(cat, ‘name’, { configurable: false });
delete cat.name; // wont delete as configurable is false
console.log(cat.name); // foo
delete (cat.age); // will be deleted
console.log(cat.age); // undefined

在上头的代码中,你会意识JavaScript不会去除name属性,因为name属性的configurable设置为false。

configurable

特性的别样特色是不是足以配备取决于configurable的值。假使属性configurable设置为false,则不可以更改writable和enumerable的值。请看上面的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
Object.defineProperty(cat, 'name', { enumerable: false });

在此地,我们将name属性的configurable设置为false。之后,大家将enumerable设置为false。如前所述,一旦一个特性的configurable设置为false,那么你就不可能改变另一个特点。

对于地点的代码,JavaScript会抛出一个TypeError相当,如下图所示。你会博得不可能再度定义属性名称的谬误:

 
亚洲必赢官网 7
image

在使用configurable的时候,你需要牢记,改变configurable的值只可以做三遍。若是将性能的configurable设置为false,那么你就无法重新分配它;你无法收回对configurable的改动。请看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
Object.defineProperty(cat, 'name', { configurable: true });

大家在重新分配name属性的configurable,不过,JavaScript会对上述操作抛出一个TypeError,如下图所示。正如你所观察的,一旦configurable被安装为false,就不可以废除那多少个更改。

 
亚洲必赢官网 8
image

另一个器重的事务是,纵然configurable设置为false,writable也能够从true更改为false——但反之则不然。请看上面的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
Object.defineProperty(cat, 'name', { writable: false });
cat.name = 'koo';
console.log(cat.name); // foo

若是或不是在从严格局下,上边的代码不会抛出任何非常。正如大家眼前所谈论的,即便configurable为false,writable也足以从true变为false,反之则不然。另一个须要牢记的要害事项是,你不可能删除configurable设置为false的属性。

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
delete cat.name; // wont delete as configurable is false 
console.log(cat.name); // foo 
delete (cat.age); // will be deleted
console.log(cat.age); // undefined

在地方的代码中,你会发觉JavaScript不会去除name属性,因为name属性的configurable设置为false。

乍一看,好像对象cat有字符串和数字值那五个特性。然则,那不不过JavaScript解释器。在ES5中,介绍了性能描述符的定义。在大家继续探讨属性描述符从前,让我们试着应对多少个问题:

乍一看,好像对象cat有字符串和数字值那七个属性。可是,那不光是JavaScript解释器。在ES5中,介绍了性能描述符的概念。在大家再三再四商量属性描述符以前,让大家试着回答多少个问题:

enumerable

对此一个性能,即使您设置了enumerable:false,那么那几个特性将不会现出在枚举中,因而它无法用在诸如for
… in循环那样的讲话中。

请看上面的代码:

var cat = { name: ‘foo’, age: 9 }; Object.defineProperty(cat, ‘name’, {
enumerable: false }); for (let f in cat) { console.log(f); // will print
only age }

1
2
3
4
5
6
7
8
var cat = {
    name: ‘foo’,
    age: 9
};
Object.defineProperty(cat, ‘name’, { enumerable: false });
for (let f in cat) {
    console.log(f); // will print only age
}

在此处,你只好取得age,因为name的enumerable被安装为了false。那是另一个急需记住的关键事项:通过设置enumerable:false,唯一的特性将不得用于枚举。大家来看上边的代码:

var cat = { name: ‘foo’, age: 9 }; Object.defineProperty(cat, ‘name’, {
enumerable: false }); console.log(cat.name); // foo console.log(‘name’
in cat); // true

1
2
3
4
5
6
7
var cat = {
    name: ‘foo’,
    age: 9
};
Object.defineProperty(cat, ‘name’, { enumerable: false });
console.log(cat.name); // foo
console.log(‘name’ in cat); // true

在那边,name属性enumerable设置为false,但你可以访问它。在自我批评name是不是属于cat的属性时,你也会发觉是true。

奇迹,你或许需求检讨某个特定属性enumerable是不是设置为false或true。你可以因此选拔propertyIsEnumerable方法来形成那一点:

var cat = { name: ‘foo’, age: 9 }; Object.defineProperty(cat, ‘name’, {
enumerable: false }); console.log(cat.propertyIsEnumerable(“name”)); //
false

1
2
3
4
5
6
var cat = {
    name: ‘foo’,
    age: 9
};
Object.defineProperty(cat, ‘name’, { enumerable: false });
console.log(cat.propertyIsEnumerable("name")); // false

enumerable

对此一个性能,即使你设置了enumerable:false,那么那个特性将不会冒出在枚举中,由此它无法用在比如for
… in循环这样的讲话中。

请看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { enumerable: false });
for (let f in cat) {
    console.log(f); // will print only age 
}

在此地,你只好取得age,因为name的enumerable被装置为了false。那是另一个索要记住的第一事项:通过设置enumerable:false,唯一的性质将不得用于枚举。大家来看上面的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { enumerable: false });
console.log(cat.name); // foo 
console.log('name' in cat); // true

在此处,name属性enumerable设置为false,但你能够访问它。在自我批评name是或不是属于cat的习性时,你也会发觉是true。

偶然,你或许要求检查某个特定属性enumerable是不是设置为false或true。你可以透过利用propertyIsEnumerable方法来完毕那或多或少:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { enumerable: false });
console.log(cat.propertyIsEnumerable("name")); // false
  • 何以成立只读属性?
  • 哪些制定恒河沙数的习性?
  • 怎么着使属性不可配置?
  • 如何规定一个属性是或不是是只读的?
  • 怎么样创造只读属性?
  • 哪些制订多如牛毛的属性?
  • 什么样使属性不可配置?
  • 怎么确定一个属性是还是不是是只读的?

结论

用作一名正式的JavaScript开发人士,你必须对JavaScript对象属性描述符有一个很好的知晓,我愿意您能从那篇小说中学到部分知识!请继续关切大家的下一篇小说,继续上学JavaScript中更首要的定义。

1 赞 收藏
评论

亚洲必赢官网 9

结论

作为一名正式的JavaScript开发人员,你不可能不对JavaScript对象属性描述符有一个很好的接头,我期望你能从那篇小说中学到有些知识!请继续关怀我们的下一篇文章,继续攻读JavaScript中更尊崇的概念。

若是你知道属性描述符,那么你就足以应对所有那几个题材。

若是您了然属性描述符,那么你就可以答应所有那些题目。

欢迎到场学习交换群569772982,我们一块儿学习互换。

JavaScript——第 7
部分:对象属性描述符,javascript
在JavaScript中,你可以如下所示创造一个对象字面量: var cat = { name:
‘foo’, age:…

请看上边的代码:

请看上面的代码:

var cat = {
    name: 'foo',
    age: 9
};
var a = Object.getOwnPropertyDescriptor(cat, 'name');
console.log(a);
var cat = {
    name: 'foo',
    age: 9
};
var a = Object.getOwnPropertyDescriptor(cat, 'name');
console.log(a);

输出将如下所示:

输出将如下所示:

亚洲必赢官网 10

 

image

亚洲必赢官网 11

正如你在此处看到的,这些特性有多少个特征:

image

value保存属性的数量,而writable,enumerable和configurable则讲述属性的其余特色。接下来大家将对那个特色一一解说。

正如您在此地看到的,那一个特性有多少个特色:

writable

性能的值是或不是可以变更是由writable特征决定的。即使writable设置为false,那么属性的值不可能更改,JavaScript将忽略属性值中的任何变动。请看上面的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { writable: false });
console.log(cat.name); // foo 
cat.name = "koo"; // JavaScript will ignore it as writable is set to false 
console.log(cat.name); // foo

你可以应用Object.defineProperty更改writable、enumerable和configurable特征的值。大家稍后会在那篇小说中详尽谈论Object.defineProperty,但正如你在上边的代码片段中见到的那样,大家早已将writable属性设置为false,从而改变了name属性的值。JavaScript将忽略重新分配,并且name属性的值将保持为foo。

假使以严酷形式运作代码,那么为了重新分配writable设置为false的属性值,JavaScript将抛出分外。请看上边的代码:

'use strict';
var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { writable: false });
console.log(cat.name); // foo 
cat.name = "koo"; // error

在那里,JavaScript以严谨格局运作,由此,当你重新分配name属性的值时,JavaScript将抛出万分,如下所示:

亚洲必赢官网 12

image

此处的荒唐消息说,你不能赋值到只读属性。也就是说,若是属性的writable特征设置为false,那么属性将充当只读属性。

value保存属性的数据,而writable,enumerable和configurable则讲述属性的其余特色。接下来我们将对那几个特色一一演说。

configurable

性能的其他特色是或不是足以布置取决于configurable的值。如若属性configurable设置为false,则不可能改变writable和enumerable的值。请看上面的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
Object.defineProperty(cat, 'name', { enumerable: false });

在此处,大家将name属性的configurable设置为false。之后,大家将enumerable设置为false。如前所述,一旦一个特性的configurable设置为false,那么你就不可以更改另一个特性。

对此地点的代码,JavaScript会抛出一个TypeError极度,如下图所示。你会拿走不能够再一次定义属性名称的错误:

亚洲必赢官网 13

image

在采纳configurable的时候,你须要牢记,改变configurable的值只可以做一遍。借使将性能的configurable设置为false,那么您就不能重新分配它;你不能打消对configurable的更改。请看下面的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
Object.defineProperty(cat, 'name', { configurable: true });

咱俩在重新分配name属性的configurable,不过,JavaScript会对上述操作抛出一个TypeError,如下图所示。正如你所寓指标,一旦configurable被装置为false,就不可以打消那些更改。

亚洲必赢官网 14

image

另一个至关首要的事体是,即便configurable设置为false,writable也得以从true更改为false——但反之则不然。请看上面的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
Object.defineProperty(cat, 'name', { writable: false });
cat.name = 'koo';
console.log(cat.name); // foo

只要不是在严刻形式下,上面的代码不会抛出其他越发。正如大家眼前所谈论的,即便configurable为false,writable也可以从true变为false,反之则不然。另一个亟需记住的要害事项是,你无法删除configurable设置为false的性能。

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
delete cat.name; // wont delete as configurable is false 
console.log(cat.name); // foo 
delete (cat.age); // will be deleted
console.log(cat.age); // undefined

在上头的代码中,你会意识JavaScript不会去除name属性,因为name属性的configurable设置为false。

writable

特性的值是不是足以转移是由writable特征决定的。如果writable设置为false,那么属性的值不可能改变,JavaScript将忽略属性值中的任何变更。请看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { writable: false });
console.log(cat.name); // foo 
cat.name = "koo"; // JavaScript will ignore it as writable is set to false 
console.log(cat.name); // foo

您可以使用Object.defineProperty更改writable、enumerable和configurable特征的值。我们稍后会在那篇文章中详尽座谈Object.defineProperty,但正如你在地点的代码片段中来看的那么,大家早就将writable属性设置为false,从而改变了name属性的值。JavaScript将忽略重新分配,并且name属性的值将保险为foo。

如若以从严形式运作代码,那么为了重新分配writable设置为false的属性值,JavaScript将抛出越发。请看下边的代码:

'use strict';
var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { writable: false });
console.log(cat.name); // foo 
cat.name = "koo"; // error

在此地,JavaScript以从严方式运行,因而,当你重新分配name属性的值时,JavaScript将抛出格外,如下所示:

 

亚洲必赢官网 15

image

此地的一无是处新闻说,你不能够赋值到只读属性。也就是说,如果属性的writable特征设置为false,那么属性将充当只读属性。

enumerable

对于一个性质,如若你设置了enumerable:false,那么这几个特性将不会油可是生在枚举中,因而它不可以用在比如for
… in循环那样的言辞中。

请看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { enumerable: false });
for (let f in cat) {
    console.log(f); // will print only age 
}

在那边,你只好取得age,因为name的enumerable被安装为了false。那是另一个亟待记住的首要事项:通过设置enumerable:false,唯一的性能将不得用于枚举。大家来看上面的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { enumerable: false });
console.log(cat.name); // foo 
console.log('name' in cat); // true

在此间,name属性enumerable设置为false,但你可以访问它。在自我批评name是或不是属于cat的性质时,你也会发觉是true。

有时,你或许须要检查某个特定属性enumerable是还是不是设置为false或true。你可以透过动用propertyIsEnumerable方法来形成这或多或少:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { enumerable: false });
console.log(cat.propertyIsEnumerable("name")); // false

configurable

性能的其他特色是还是不是足以计划取决于configurable的值。若是属性configurable设置为false,则不可能改变writable和enumerable的值。请看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
Object.defineProperty(cat, 'name', { enumerable: false });

在那里,大家将name属性的configurable设置为false。之后,咱们将enumerable设置为false。如前所述,一旦一个属性的configurable设置为false,那么您就不能够更改另一个特征。

对此地方的代码,JavaScript会抛出一个TypeError分外,如下图所示。你会取得不可能再一次定义属性名称的谬误:

 

亚洲必赢官网 16

image

在行使configurable的时候,你须要记住,改变configurable的值只好做三遍。要是将性能的configurable设置为false,那么您就不可以重新分配它;你不能废除对configurable的变更。请看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
Object.defineProperty(cat, 'name', { configurable: true });

大家在重新分配name属性的configurable,不过,JavaScript会对上述操作抛出一个TypeError,如下图所示。正如您所见到的,一旦configurable被设置为false,就不能撤除那一个更改。

 

亚洲必赢官网 17

image

另一个主要的业务是,尽管configurable设置为false,writable也得以从true更改为false——但反之则不然。请看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
Object.defineProperty(cat, 'name', { writable: false });
cat.name = 'koo';
console.log(cat.name); // foo

假若不是在严刻格局下,上边的代码不会抛出其他越发。正如我们面前所琢磨的,即便configurable为false,writable也可以从true变为false,反之则不然。另一个亟待记住的重点事项是,你不可能删除configurable设置为false的性能。

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { configurable: false });
delete cat.name; // wont delete as configurable is false 
console.log(cat.name); // foo 
delete (cat.age); // will be deleted
console.log(cat.age); // undefined

在下边的代码中,你会发觉JavaScript不会删除name属性,因为name属性的configurable设置为false。

结论

作为一名正式的JavaScript开发人士,你不可以不对JavaScript对象属性描述符有一个很好的明白,我梦想你能从那篇小说中学到一些文化!请继续关切大家的下一篇文章,继续学习JavaScript中更关键的概念。

enumerable

对此一个特性,如若您设置了enumerable:false,那么这几个特性将不会产出在枚举中,由此它不能用在诸如for
… in循环那样的口舌中。

请看上面的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { enumerable: false });
for (let f in cat) {
    console.log(f); // will print only age 
}

在这里,你不得不获得age,因为name的enumerable被设置为了false。那是另一个急需牢记的首要事项:通过设置enumerable:false,唯一的属性将不可用于枚举。大家来看上边的代码:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { enumerable: false });
console.log(cat.name); // foo 
console.log('name' in cat); // true

在此地,name属性enumerable设置为false,但您可以访问它。在检查name是不是属于cat的性能时,你也会意识是true。

偶尔,你可能须求检讨某个特定属性enumerable是还是不是设置为false或true。你可以由此使用propertyIsEnumerable方法来成功这点:

var cat = {
    name: 'foo',
    age: 9
};
Object.defineProperty(cat, 'name', { enumerable: false });
console.log(cat.propertyIsEnumerable("name")); // false

迎接插手学习沟通群569772982,大家一起上学沟通。

结论

用作一名专业的JavaScript开发人士,你必须对JavaScript对象属性描述符有一个很好的领悟,我盼望您能从那篇小说中学到有的文化!请继续关怀我们的下一篇作品,继续求学JavaScript中更要紧的定义。

迎接参预学习沟通群569772982,大家一块学习交换。

网站地图xml地图