JavaScript基础概念之----面向对象----理解对象

创建自定义对象最简单的方式是创建一个Object的实例:

var person = new Object()

person.name = 'adhehe'
person.age = 23
person.job = '程序开发'

person.getName = function(){
    return this.name
}

使用对面字面量创建一个普通对象实例:

var person = {
    name:'adhehe',
    age:23,
    job:'程序开发',
    getName:function(){
        return this.name
    }
}

ECMAScript中有两种属性类型

  • 数据属性
  • 访问器属性

数据属性

它包含一个数据值的位置,在这个位置可以读取和写入值。

[[Configurable]]:

  • 能否delete删除属性从而重新定义属性
  • 能否修改属性的特性
  • 能否把属性修改为访问器属性
  • 直接在对象上定义的属性,Configurable 默认值为true

[[Enumerable]]:

  • 能否通过 for-in 循环返回属性
  • 直接在对象上定义的属性,Enumerable 默认值为true

[[Writable]]:

  • 能否修改属性的值
  • 直接在对象上定义的属性,Enumerable默认值为true

[[Value]]:

  • 包含这个属性的数据值
  • 读取属性值的时候,从这个位置读取
  • 写入属性值的时候,把新值保存在这个位置
  • 默认值为undefined

要修改属性默认的特性,必须使用 Object.defineProperty()方法:

var person = {}

Object.defineProperty(person,'name',{
    configurable:false,
enumerable:true, writable:
false, value:'adhehe' })

//一旦把属性定义为不可配置的,就不能再把它变回可配置了
//在调用此方法创建的新的属性时,如果不指定,则configurable、enumerable、writable默认值都为false

访问器属性

它不包含数据值,它包含一对getter函数和setter函数

[[Configurable]]:

  • 能否delete删除属性从而重新定义属性
  • 能否修改属性的特性
  • 能否把属性修改为访问器属性
  • 直接在对象上定义的属性,Configurable 默认值为true

[[Enumerable]]:

  • 能否通过 for-in 循环返回属性
  • 直接在对象上定义的属性,Enumerable 默认值为true

[[Get]]:

  • 读取属性时调用的函数
  • 默认值为undefined
  • 如果未指定此函数,则属性不可读取

[[Set]]:

  • 写入属性时调用的函数
  • 默认值为undefined
  • 如果未指定此函数,则属性不可写入

访问器属性不能直接定义,必须使用 Object.defineProperty()来定义。

var person = {
    name:'adhehe',
    _age:23
}

Object.defineProperty(person,'age',{
    get:function(){
        return this._age;
    },
    set:function(newVal){
        if(newVal > 59){
            this._age = 'old';
        }else{
     this._age = newVal;
     } } }) person.age
= 45; console.log(person.age)//输出 45 person.age = 65; console.log(person.age)//输出 old

Object.defineProperties()方法可一次定义多个属性:

var person = {}

Object.defineProperties(person,{
    name:{
        writable:true,
        value:'adhehe'
    },
     _age:{
        writable:true,
        value:23
    },
    age:{
        get:function(){
            return this._age;
        },
        set:function(newVal){
            if(newVal > 59){
                this._age = 'old';
            }else{
                this._age = newVal;
            }
        }
    }
})        

Object.getOwnPropertyDescriptor()方法可取得给定属性的描述符:

//以前面person为例

var desc = Object.getOwnPropertyDescriptor(person,'name');
console.log(desc.value) //adhehe
console.log(desc.configurable) //false
console.log(desc.get) //undefined
原文地址:https://www.cnblogs.com/adhehe/p/9787418.html