关于JavaScript函数
object.defineProperty()函数
再学习这个函数之前,我们先创建一个object对象
var person = {}
person.name = "junlebao"
person.age = 17
person.isAdult = "未成年"
这样我们创建对象完成之后,我们在思考几个问题
现在我有几个要求:
要求1: 我们的age属性代表年龄,总不能是个负数吧,首先age应该有一个限制.
要求2: 我们的isAdult是随着age的不同,所显示的转态也不同.
显然,上述的方法创建的对象,无法满足我们这些要求.
这时候,我们的object.defineProperty()函数就派上了用场,我们就先上代码
注意:以下代码中,在对象的定义中,写的是带下划线的:_age,
而在defineProperty()函数里写的属性名是不带下划线的:age,
外部使用该对象的属性时,用不带下划线的:
1 var person = { 2 _age: 16, 3 isAdult: "未成年" 4 } 5 Object.defineProperty(person, 'age', { 6 get: function () { //读取时用到的函数 7 return this._age 8 }, 9 set: function (newValue) { //设置属性值的时候用到的函数 10 if (newValue > 0 && newValue <= 150) { //对年龄一个限制,在(0,150]之间 11 this._age = newValue 12 if (this._age >= 18) { 13 this.isAdult = "已成年" 14 } 15 } 16 } 17 }) 18 person.age = 12 //调用set函数 19 console.log(person.age); //调用get函数 20 console.log(person.isAdult); //未成年 21 person.age = 25 //调用set函数 22 console.log(person.age); //调用get函数 23 console.log(person.isAdult); //已成年
运行结果如下:
Object.defineProperty()的作用就是直接在一个对象上定义一个新属性,或者修改一个已经存在的属性。
Object.defineProperty()函数的格式:
Object.defineProperty(obj, prop, desc)
参数:
Obj:表示增加属性的对象 (必需)
Prop:属性名 (必需)
Desc:描述属性的一个集合 (必需)
数据描述符: 拥有可写或不可写值的属性*
value : 属性的值,可以为任意类型 默认为undefined
wriable: 属性的值是否可以被修改 为true(默认值)可以被修改 为false 不可以被修改
存取描述符:由一对getter-setter函数功能来描述的属性*
get:在读取属性时调用的函数,默认值为undefined。
set:在写入属性时调用的函数,默认值为undefined。
下面两个是公有的属性
enumerable: 此属性是否可以被枚举(使用for...in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。
configurable: 是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。设置为true可以被删除或可以重新设置特性;设置为false,不能被可
以被删除或不可以重新设置特性。默认为false。有两个作用: 目标属性是否可以使用delete删除,目标属性是否可以再次设置特性.
提示:一旦使用Object.defineProperty给对象添加属性,那么如果不设置属性的特性,那么configurable、enumerable、writable这些值都为默认的false.