轻松学习

轻松学习 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地图