mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-28 21:32:20 +00:00
edit symbol/magic string
This commit is contained in:
parent
8afab8ca89
commit
f05acc0c84
@ -182,6 +182,61 @@ function getComplement(color) {
|
||||
|
||||
还有一点需要注意,Symbol值作为属性名时,该属性还是公开属性,不是私有属性。
|
||||
|
||||
## 实例:消除魔术字符串
|
||||
|
||||
魔术字符串指的是,在代码之中多次出现、与代码形成强耦合的某一个具体的字符串或者数值。风格良好的代码,应该尽量消除魔术字符串,该由含义清晰的变量代替。
|
||||
|
||||
```javascript
|
||||
function getArea(shape, options) {
|
||||
var area = 0;
|
||||
|
||||
switch (shape) {
|
||||
case 'Triangle': // 魔术字符串
|
||||
area = .5 * options.width * options.height;
|
||||
break;
|
||||
/* ... more code ... */
|
||||
}
|
||||
|
||||
return area;
|
||||
}
|
||||
|
||||
getArea('Triangle', { width: 100, height: 100 }); // 魔术字符串
|
||||
```
|
||||
|
||||
上面代码中,字符串“Triangle”就是一个魔术字符串。它多次出现,与代码形成“强耦合”,不利于将来的修改和维护。
|
||||
|
||||
常用的消除魔术字符串的方法,就是把它写成一个变量。
|
||||
|
||||
```javascript
|
||||
var shapeType = {
|
||||
triangle: 'Triangle'
|
||||
};
|
||||
|
||||
function getArea(shape, options) {
|
||||
var area = 0;
|
||||
switch (shape) {
|
||||
case shapeType.triangle:
|
||||
area = .5 * options.width * options.height;
|
||||
break;
|
||||
}
|
||||
return area;
|
||||
}
|
||||
|
||||
getArea(shapeType.triangle, { width: 100, height: 100 });
|
||||
```
|
||||
|
||||
上面代码中,我们把“Triangle”写成`shapeType`对象的`triangle`属性,这样就消除了强耦合。
|
||||
|
||||
如果仔细分析,可以发现`shapeType.triangle`等于哪个值并不重要,只要确保不会跟其他`shapeType`属性的值冲突即可。因此,这里就很适合改用Symbol值。
|
||||
|
||||
```javascript
|
||||
const shapeType = {
|
||||
triangle: Symbol()
|
||||
};
|
||||
```
|
||||
|
||||
上面代码中,除了将`shapeType.triangle`的值设为一个Symbol,其他地方都不用修改。
|
||||
|
||||
## 属性名的遍历
|
||||
|
||||
Symbol作为属性名,该属性不会出现在`for...in`、`for...of`循环中,也不会被`Object.keys()`、`Object.getOwnPropertyNames()`返回。但是,它也不是私有属性,有一个`Object.getOwnPropertySymbols`方法,可以获取指定对象的所有Symbol属性名。
|
||||
|
Loading…
x
Reference in New Issue
Block a user