自在学习,对象属性描述符

by admin on 2019年4月21日

自在学习 JavaScript(七):对象属性描述符

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中,介绍了品质描述符的定义。在我们一而再研究属性描述符此前,让咱们试着应对多少个难题:

  • 什么创制只读属性?
  • 怎么样制订恒河沙数的天性?
  • 如何使属性不可配置?
  • 自在学习,对象属性描述符。什么样鲜明5个性能是或不是是只读的?

即使你知道属性描述符,那么你就能够应对全数那几个难点。

请看上面包车型大巴代码:

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);

出口将如下所示:

必发88 1

正如您在那边看看的,这一个特性有八个天性:

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

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

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

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

乍一看,好像对象cat有字符串和数字值那三个本性。然则,这不光是JavaScript解释器。在ES5中,介绍了质量描述符的定义。在大家接二连三切磋属性描述符在此以前,让大家试着回答多少个难题:

  • 怎样成立只读属性?
  • 怎么制定不可胜举的属性?
  • 如何使属性不可配置?
  • 怎么样规定1本性质是还是不是是只读的?

一旦您精晓属性描述符,那么你就能够回答全体这么些标题。

请看上面包车型地铁代码:

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

出口将如下所示:

 
必发88 2
image

正如您在此处看看的,那本性子有八个特征:

value保存属性的多少,而writable,enumerable和configurable则讲述属性的任何特色。接下来我们将对那么些特色1一演说。

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

在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将抛出1二分。请看下边包车型地铁代码:

‘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将抛出卓殊,如下所示:

必发88 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将抛出分外,如下所示:

 
必发88 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。如前所述,一旦1个天性的configurable设置为false,那么你就不可能更动另一个表征。

对此位置的代码,JavaScript会抛出2个TypeError十分,如下图所示。你会获得无法再一次定义属性名称的错误:

必发88 5

在选择configurable的时候,你要求牢记,更换configurable的值只好做3次。假如将品质的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,就不能撤销那3个改换。

必发88 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。如前所述,一旦2天性质的configurable设置为false,那么您就不可能更换另二天个性。

对于地方的代码,JavaScript会抛出一个TypeError至极,如下图所示。你会赢得无法再次定义属性名称的错误:

 
必发88 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会对上述操作抛出1个TypeError,如下图所示。正如你所观察的,壹旦configurable被安装为false,就不能够撤废那二个改变。

 
必发88 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,反之则不然。另1个急需记住的重大事项是,你不可能删除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,唯1的属性将不可用于枚举。大家来看上边的代码:

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

对于3个属性,纵然你设置了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
  • 什么样创设只读属性?
  • 怎么制定恒河沙数的品质?
  • 什么使属性不可配置?
  • 何以显明一特性情是还是不是是只读的?
  • 什么样成立只读属性?
  • 什么制定恒河沙数的性质?
  • 哪些使属性不可配置?
  • 必发88,怎么着规定叁个属性是或不是是只读的?

结论

作为一名职业的JavaScript开荒职员,你不能够不对JavaScript对象属性描述符有2个很好的驾驭,笔者期待您能从这篇小说中学到一些学问!请继续关怀我们的下1篇小说,继续深造JavaScript中更首要的概念。

1 赞 收藏
评论

必发88 9

结论

用作一名专门的职业的JavaScript开拓职员,你必须对JavaScript对象属性描述符有三个很好的明白,小编盼望您能从那篇文章中学到部分知识!请继续关怀大家的下一篇文章,继续攻读JavaScript中更关键的定义。

一经你知道属性描述符,那么你就能够应对全部那几个难点。

借使您精通属性描述符,那么你就可以回答全体那些难点。

应接插手学习沟通群56977298二,我们一块儿学学沟通。

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);

输出将如下所示:

出口将如下所示:

必发88 10

 

image

必发88 11

正如你在此间看看的,这一个本性有八本性状:

image

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

正如您在此处看看的,那天性情有多个特征:

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将抛出格外,如下所示:

必发88 12

image

那里的一无可撤除息说,你不能够赋值到只读属性。也等于说,如若属性的writable特征设置为false,那么属性将出任只读属性。

value保存属性的多寡,而writable,enumerable和configurable则讲述属性的其他特色。接下来咱们将对这几个特征一1解说。

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。如前所述,1旦一性子能的configurable设置为false,那么您就不能够改变另四个特征。

对于地点的代码,JavaScript会抛出1个TypeError格外,如下图所示。你会获取不能再度定义属性名称的错误:

必发88 13

image

在选择configurable的时候,你须要牢记,改换configurable的值只能做2次。纵然将品质的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,如下图所示。正如您所看到的,1旦configurable被安装为false,就无法打消那一个改造。

必发88 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,反之则不然。另3个亟待牢记的严重性事项是,你不可能删除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将抛出11分。请看上边包车型大巴代码:

'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将抛出十分,如下所示:

 

必发88 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。那是另3个亟需记住的根才能项:通过设置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。如前所述,1旦两性情子的configurable设置为false,那么你就不能够退换另贰个特色。

对此地点的代码,JavaScript会抛出3个TypeError至极,如下图所示。你会获取不可能再度定义属性名称的荒唐:

 

必发88 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,就不可能裁撤那么些改动。

 

必发88 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,反之则不然。另3个急需牢记的第二事项是,你无法删除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对象属性描述符有三个很好的精晓,笔者盼望您能从那篇小说中学到有的文化!请继续关注大家的下1篇小说,继续求学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。那是另二个亟需记住的第3事项:通过设置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

应接插足学习交换群569772九八二,咱们齐声上学沟通。

结论

用作一名专门的学问的JavaScript开荒职员,你无法不对JavaScript对象属性描述符有三个很好的接头,笔者期待您能从那篇文章中学到有个别知识!请继续关注大家的下1篇小说,继续深造JavaScript中更首要的概念。

招待出席学习沟通群56977298贰,我们一齐读书调换。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图