关于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.

 

posted @ 2020-06-23 16:45  junlebao  阅读(125)  评论(0编辑  收藏  举报