今天我想玩儿一下 Javascript Object 的属性。开始:
Create Property Through Assignment
如果我创建一个对象
var cat = {};
我就可以这样给他添加一些属性。
cat.name = 'Kitty';
cat.birthYear = 2016;
我们就可以访问这些属性了!
console.log(cat.name); // => Kitty
console.log(cat.birthYear); // => 2016
还可以为他们的属性赋值。
cat.name = 'Tom';
console.log(cat.name); // => Tom
这真是太简单了。但是有些时候我并不希望一些属性被更改。比如说生日。Reset,重新创建世界!
Create Property via defineProperty
var cat = {};
这回使用另外一种手段来添加属性。
Object.defineProperty(cat, 'birthYear', {
__proto__: null,
configurable: false,
value: 2016
});
我仍然能够访问这个属性的值,真是太美妙了。
console.log(cat.birthYear); // => 2016
而我现在要改变这个值了!
cat.birthYear = 2017;
console.log(cat.birthYear); // => 2016
还是 2016!成功了,这回没有人可以更改我的生日了……么?我要试一试。
delete cat.birthYear;
console.log(cat.birthYear); // => 2016
我的天,竟然不能够 delete,太精彩了。那么可以重新定义吗?
Object.defineProperty(cat, 'birthYear', {
__proto__: null,
configurable: true,
value: 2017
});
// => Error: TypeError: can't redefine non-configurable property "birthYear"
完美防范。
Make Equivalent
其实他们是一样的。只不过 property 的 descriptor 不一样而已。例如:
var cat = { name = 'Kitty' };
var descriptor = Object.getOwnPropertyDescriptor(cat, 'name');
console.log(descriptor);
输出
{
value: 'Kitty',
writable: true,
enumerable: true,
configurable: true
}
因此只要我这样进行定义:
Object.defineProperty(cat, 'name', {
configurable: true,
writable: true,
enumerable: true,
value: 2016
});
结果就和 var cat = { name = 'Kitty' }
一样了。
版权声明:自由转载-非商用-非衍生-保持署名 Eleven1987
本文永久链接:
https://eleven1987.github.io/2016/01/05/playing-javascript-property