练习:Property of Javascript Object

今天我想玩儿一下 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