其他分享
首页 > 其他分享> > js系列三十一:属性类型

js系列三十一:属性类型

作者:互联网

在上面的继承实现中,使用了一个大家可能不太熟悉的方法;defineProperties,并且在定义getGrade时使用了一个很奇怪的方式。

getGrade:{
	value: function() {
		return this.grade;
	}
}

这个其实是对象中的属性类型,通常给对象添加一个属性时,直接使用 Object.param的方式就可以了,或者直接在对象中挂载。

var person = {
	name: 'Ken'
}

在ECMAScript5中,对每一个属性都添加了几个属性类型,用来描述这些属性的特性,具体如下:

需要注意的是,不能同时设置value,writable与get,set的值。

可以通过Object.defineProperty方法修改这些属性类型。
下面就通过几个简单的例子来演示这些属性类型的具体表现

configurable

// 用普通的方式给 person 对象添加一个 name 属性,值为Ken
var person = {
	name: "Ken"
}

//使用delete删除该属性
delete person.name; //返回true,表示删除成功

// 通过Object.defineProperty重新添加name属性
Object.defineProperty(person, 'name', {
	configurable: false,
	value: 'Ken'
})
// 再次删除
delete person.name // false

console.log(person.name);

// 试图改变value
person.name = 'aa'
console.log(person.name) // Ken 改变失败

enumerable

var person = {
	name: 'KEN',
	age: 20
}
// 使用for-in循环枚举Person的值
var param = [];
for(var key in person) {
	params.push(key);
}

// 查看枚举结果
console.log(params);

// 重新设置name属性的类型,让其不可被枚举
Object.defineProperty(person, 'name', {
	enumerable: false
})

var params_ = [];
for(var key in person){
	params_.push(key);
}
// 再次查看
console.log(params_);

writable

var person = {
	name: 'Ken'
}

// 修改name的值
person.name = "Jake";
// 查看修改的结果
console.log(person.name) // jake

//设置name属性不能被修改
Object.defineProperty(person, 'name', {
	writable: false
})

// 再次视图修改name的值
person.name = 'alex'
console.log(person.name); //修改失败

value

var person = {}
// 添加一个name属性
Object.defineProperty(person, 'name', {
	value: "Ken"
})

console.log(person.name) // ken

get/set

var person = {};
// 通过get与set自定义访问,设置name属性
Object.defineProperty(person, 'name', {
	get: function() {
		return "Ken"
	},
	set: function(value) {
		console.log(value + 'in set');
	}
});

// 第一次访问 name ,调用get
console.log(person.name)

// 尝试修改name值,此时set方法被调用
person.name = "alex";

// 第一次访问 name,还是调用get
console.log(person.name) // ken

注意:请尽量同时设置 get 和 set。如果,只设置了 get,那么将无法设置该属性,如果只设置 set 那么将无法获取值
Object.defineProperty只能设置一个属性的属性特性,当想要同时设置多个属性的特性时,需要使用之前介绍过的 Object.defineProperties属性

var person = {}
Object.defineProperties(person, {
	name: {
		value: "Jake",
		configurable: true
	},
	age: {
		get: function() {
			return this.value || 22
		},
		set: function(value) {
			this.value = value
		}
	},
})

person.name //Jake
person.age // 22

读取属性的特性值

可以利用Object.getOwnPropertyDescriptor方法读取某一个属性值

var person = {}
Object.defineProperty(person, 'name', {
	value: 'alex',
	writable: false,
	configure: false
})

var descripter = Object.getOwnPropertyDescriptor(person, 'name');
console.log(descripter)

descripter = {
	configurable: false,
	enumerable: false,
	value: 'alex',
	writable: false
}

标签:name,Object,三十一,value,js,person,var,属性
来源: https://blog.csdn.net/qq_36772866/article/details/89006973