Skip to content

Commit bd5ad1b

Browse files
update define property 3
1 parent 6f4a71b commit bd5ad1b

File tree

1 file changed

+70
-77
lines changed

1 file changed

+70
-77
lines changed

vanilla-js/object/define-property.md

Lines changed: 70 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -95,92 +95,85 @@ Object.defineProperty(obj, prop, descriptor)
9595
dream.name = 'apple'; // 修改name属性
9696
console.log(dream.name); // 并不是apple,依旧是dreamapple
9797
```
98-
从上面的代码中我们可以看到,我们给`dream`定义了一个新的属性`name`,然后我们打印出这个属性就是我们预期的那样,得到的是`dreamapple`;
99-
但是,当我们尝试改变这个属性的时候,却发现这个属性并没有改变,还以第一次我们赋给它的值;这是为什么呢?
100-
原来,只有当我们这个属性的`writable`修饰为`true`时,我们这个属性才可以被修改.
98+
从上面的代码中我们可以看到,我们给`dream`定义了一个新的属性`name`,然后我们打印出这个属性就是我们预期的那样,得到的是`dreamapple`;但是,当我们尝试改变这个属性的时候,却发现这个属性并没有改变,还以第一次我们赋给它的值;这是为什么呢?原来,只有当我们这个属性的`writable`修饰为`true`时,我们这个属性才可以被修改.
10199

102-
+ **writable** 当且仅当仅当该属性的`writable``true`时,该属性才能被赋值运算符改变;它的默认值为false.我们来修改一下上面的代码,
103-
让属性`name`可以被修改:
104-
```javascript
105-
Object.defineProperty(dream, 'name', {
106-
value: 'dreamapple',
107-
writable: true
108-
});
109-
110-
console.log(dream.name); // dreamapple
111-
dream.name = 'apple'; // 修改name属性
112-
console.log(dream.name); // apple
113-
```
100+
+ **writable** 当且仅当仅当该属性的`writable``true`时,该属性才能被赋值运算符改变;它的默认值为false.我们来修改一下上面的代码,让属性`name`可以被修改:
101+
```javascript
102+
Object.defineProperty(dream, 'name', {
103+
value: 'dreamapple',
104+
writable: true
105+
});
106+
107+
console.log(dream.name); // dreamapple
108+
dream.name = 'apple'; // 修改name属性
109+
console.log(dream.name); // apple
110+
```
114111
我们可以看到,当我们把`writable`修改为`true`时,我们就可以修改`name`属性了.
115112

116-
+ **enumerable** 这个特性决定了我们定义的属性是否是可枚举的类型,默认是`false`;只有我们把它设置为`true`的时候这个属性才可以使用`for(prop in obj)``Object.keys()`
117-
中枚举出来.就像下面这样:
118-
```javascript
119-
Object.defineProperty(dream, 'a', {
120-
value: 1,
121-
enumerable: false // 不可枚举
122-
});
123-
Object.defineProperty(dream, 'b', {
124-
value: 2,
125-
enumerable: true // 可枚举
126-
});
127-
128-
// 只会输出 b
129-
for(prop in dream) {
130-
console.log(prop);
131-
}
132-
133-
console.log(Object.keys(dream)); // ['b']
134-
135-
console.log(dream.propertyIsEnumerable('a')); // false
136-
console.log(dream.propertyIsEnumerable('b')); // true
137-
```
113+
+ **enumerable** 这个特性决定了我们定义的属性是否是可枚举的类型,默认是`false`;只有我们把它设置为`true`的时候这个属性才可以使用`for(prop in obj)``Object.keys()`中枚举出来.就像下面这样:
114+
```javascript
115+
Object.defineProperty(dream, 'a', {
116+
value: 1,
117+
enumerable: false // 不可枚举
118+
});
119+
Object.defineProperty(dream, 'b', {
120+
value: 2,
121+
enumerable: true // 可枚举
122+
});
123+
124+
// 只会输出 b
125+
for(prop in dream) {
126+
console.log(prop);
127+
}
128+
129+
console.log(Object.keys(dream)); // ['b']
130+
131+
console.log(dream.propertyIsEnumerable('a')); // false
132+
console.log(dream.propertyIsEnumerable('b')); // true
133+
```
138134
所以当我们想给你个对象添加一个不可枚举的属性的时候,就应该把`enumerable`设置为`false`.
139135

140-
+ **configurable** 这个特性决定了对象的属性是否可以被删除,以及除`writable`特性外的其它特性是否可以被修改;并且`writable`特性值只可以是`false`
141-
我们可以写一个代码示例来演示一下这个特性:
142-
```javascript
143-
Object.defineProperty(dream, 'c', {
144-
value: 3,
145-
configurable: false
146-
});
147-
//throws a TypeError
148-
Object.defineProperty(dream, 'c', {
149-
configurable: true
150-
});
151-
//throws a TypeError
152-
Object.defineProperty(dream, 'c', {
153-
writable: true
154-
});
155-
//won't throws a TypeError
156-
Object.defineProperty(dream, 'c', {
157-
writable: false
158-
});
159-
delete dream.c; // 属性不可以被删除
160-
console.log(dream.c); // 3
161-
```
136+
+ **configurable** 这个特性决定了对象的属性是否可以被删除,以及除`writable`特性外的其它特性是否可以被修改;并且`writable`特性值只可以是`false`我们可以写一个代码示例来演示一下这个特性:
137+
```javascript
138+
Object.defineProperty(dream, 'c', {
139+
value: 3,
140+
configurable: false
141+
});
142+
//throws a TypeError
143+
Object.defineProperty(dream, 'c', {
144+
configurable: true
145+
});
146+
//throws a TypeError
147+
Object.defineProperty(dream, 'c', {
148+
writable: true
149+
});
150+
//won't throws a TypeError
151+
Object.defineProperty(dream, 'c', {
152+
writable: false
153+
});
154+
delete dream.c; // 属性不可以被删除
155+
console.log(dream.c); // 3
156+
```
162157
+ **get** 一个给属性提供`getter`的方法,如果没有`getter`则为`undefined`;该方法返回值被用作属性值,默认为undefined.
163-
+ **set** 一个给属性提供`setter`的方法,如果没有`setter`则为`undefined`;该方法将接受唯一参数,并将该参数的新值分配给该属性,默认为undefined.
164-
知道了这些之后我们就可以使用更标准的一种方式去解决我们在文中开头的问题了:
165-
```javascript
166-
Object.defineProperty(dreamapple, 'fullName', {
167-
enumerable: true,
168-
get: function () {
169-
return this.firstName + ' ' + this.lastName;
170-
},
171-
set: function (fullName) {
172-
var names = fullName.trim().split(' ');
173-
if (2 === names.length) {
174-
this.firstName = names[0];
175-
this.lastName = names[1];
158+
+ **set** 一个给属性提供`setter`的方法,如果没有`setter`则为`undefined`;该方法将接受唯一参数,并将该参数的新值分配给该属性,默认为undefined.知道了这些之后我们就可以使用更标准的一种方式去解决我们在文中开头的问题了:
159+
```javascript
160+
Object.defineProperty(dreamapple, 'fullName', {
161+
enumerable: true,
162+
get: function () {
163+
return this.firstName + ' ' + this.lastName;
164+
},
165+
set: function (fullName) {
166+
var names = fullName.trim().split(' ');
167+
if (2 === names.length) {
168+
this.firstName = names[0];
169+
this.lastName = names[1];
170+
}
176171
}
177-
}
178-
});
179-
```
172+
});
173+
```
180174
还有一点需要注意的是,`value``get,set`是不可以共存的,就是说你定义了`value`后就不能够再定义`get,set`特性了.
181175

182-
好啦,今天的文章就写到这里了,相信大家对于`Object.defineProperty(obj, prop, descriptor)`这个方法应该掌握了;还有一点需要提及的是
183-
其实`Vue.js``计算属性`也是在这个函数的基础上进行的一些改进,详情可以看这里[计算属性的奥秘][2].
176+
好啦,今天的文章就写到这里了,相信大家对于`Object.defineProperty(obj, prop, descriptor)`这个方法应该掌握了;还有一点需要提及的是其实`Vue.js``计算属性`也是在这个函数的基础上进行的一些改进,详情可以看这里[计算属性的奥秘][2].
184177

185178
如果你对这篇文章有什么意见或者建议可以在这里提出来[issues][3]
186179

0 commit comments

Comments
 (0)