百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> 详解javascript对象的数据属性与拜访器属性
分享文章到:

详解javascript对象的数据属性与拜访器属性

发布时间:09/01 来源:未知 浏览: 关键词:

创立对象的方式有两种:第一种,通过new操纵符后面跟Object结构函数,第二种,对象字面量方式。如下

var person = new Object();
person.name = 'Nicy';
person.age = 21;
person.sayName = function() {
    console.log(this.name);
};        
var person = {
    name: 'Nicy',
    age: 21,
    sayName: function() {
        console.log(this.name);
    }
}

这两种方式创立出来的对象是一样的,有雷同的属性和办法。这些属性内部都有描写其行动的属性描写符。

Object.defineProperty()

通过Object.defineProperty() 可以直接在对象上创立一个属性,也可以修改已有的属性。

Object.defineProperty(obj, prop, descriptor) 接收三个参数:

  obj:属性所在的对象  

  prop:要拜访的属性名

  descriptor:描写符对象

描写符对象包括六个属性:configurable、enumerable、writable、value、get、set ,要修改属性的特性,必需使用Object.defineProperty()办法。

通过以上两种方式增加的对象属性,其布尔值特性默许值是true,通过Object.defineProperty来修改属性特性时,只设定需要修改的特性即可;而通过Object.defineProperty创立的属性,其布尔值特性默许值是false。

ECMAScript中属性分为两种:数据属性和拜访器属性。

数据属性

数据属性包括四个属性描写符:

[[Configurable]] : 表示能否通过delete删除属性从而从新定义属性,能否修改属性特性,能否把属性修改为拜访器属性。通过以上方式增加的对象属性,默许为true。

[[Enumerable]] : 表示能否通过for-in 轮回拜访属性。通过以上方式增加的对象属性,默许为true。

[[Writable]] : 表示能否修改属性的值。通过以上方式增加的对象属性,默许为true。

[[Value]] : 包括这个属性的数据值,可读取写入。通过以上方式增加的对象属性,默许为undefined。

Writable

var person = {};

Object.defineProperty(person, "name", {
    value: 'Nicy'
})
person.name = 'Lee';  
console.log(person.name)    // 'Nicy'

Object.defineProperty(person, "name", {
    writable: true
})
person.name = 'Lee';
console.log(person.name)    // 'Lee'

Object.defineProperty直接创立的属性writable默许为false,value值不成修改,此时修改name为Lee,在非严厉模式下不会报错,但操纵被忽略,在严厉模式下会报错。

Configurable

var person = {
name: 'Nicy',
age: 21,
sayName: function() {
console.log(this.name);
}
}

Object.defineProperty(person, "name", {
configurable: false
})

delete person.name; // 操纵被忽略,没法通过delete删除属性
Object.defineProperty(person, "name", { // throw error
configurable:true
})
Object.defineProperty(person, "name", { // throw error
enumerable: false
})
Object.defineProperty(person, "name", { // 由于writable为true,所以可以修改value
value: 'Lucy'
})console.log(person.name) // Lucy
Object.defineProperty(person, "name", { // writable可停止true -> false的单向修改
writable: false
})
Object.defineProperty(person, "name", { // throw error
value: 'Lee'
})
Object.defineProperty(person, "name", { // throw error,此时writable不成以false -> true
writable: true
})

总结一下configurable:当configurable设为false时,

  1、不成以通过delete去删除该属性从而从新定义属性;

  2、不成以转化为拜访器属性;

  3、configurable和enumerable不成被修改;

  4、writable可单向修改为false,但不成以由false改为true

  5、value可否可修改按照writable而定。

当configurable为false时,用delete删除该属性,在非严厉模式下,不会报错,但操纵被忽略,在严厉模式下会报错;其他不成被修改的特性修改时会报错。

Enumerable

enumerable表示对象属性可否可以在for...in和Object.keys()中被枚举。

var person = {};
Object.defineProperty(person, "a", { value : 1, enumerable:true });
Object.defineProperty(person, "b", { value : 2, enumerable:false });
Object.defineProperty(person, "c", { value : 3 }); // enumerable defaults to false
person.d = 4; // 假如使用直接赋值的方式创立对象的属性,则这个属性的enumerable默许为true

for (var i in person) {    
  console.log(i);  
}  //  'a' 和 'd' 

Object.keys(person); // ["a", "d"]

拜访器属性

拜访器属性包括四个属性描写符:

[[Configurable]] : 表示能否通过delete删除属性从而从新定义属性,能否修改属性特性,能否把属性修改为数据属性。直接在对象上定义的属性,默许为true。

[[Enumerable]] : 表示能否通过for-in 轮回拜访属性。直接在对象上定义的属性,默许为true。

[[Get]] : 读取属性时调取的函数,默许为undefined。

[[Set]] : 写入属性时调取的函数,默许为undefined。

var person = {
    name: 'Nicy',
    _age: 21,
    year: 1997,
    _year: 1997,
    sayName: function() {
        console.log(this.name);
    }
}

Object.defineProperty(person, "age", {
    get: function() {
        return this._age;
    },
    set: function(value) {
        this._age = value;
                // ...
    }
})

用Object.defineProperty()定义的拜访器属性,其configurable和enumerable默许为false。

数据属性与拜访器属性的彼此转换

Object.getOwnPropertyDescriptor 读取属性的特性

使用Object.getOwnPropertyDescriptor可以猎取到属性的描写符:

Object.getOwnPropertyDescriptor(obj, prop)

  obj:属性所在的对象;

  prop:要拜访的属性名。

数据属性 -> 拜访器属性

属性的特性只能是拜访器描写符和数据描写符中的一种,给已有的数据属性加get或set转换为拜访器属性时,其属性的value、writable就会被废弃。

如下代码,将对象原有的数据属性year转换为拜访器属性:

*注:在拜访器属性的get和set中,不成以使用this拜访属性本身,不然会无穷递归而致使内存走漏。

// 设定get和set其中任意一个即可转换为拜访器属性
Object.defineProperty(person, "year", {
    get: function() {
//        return this,year;    // error
        return this._year;    
    },
    set: function(value) {
//             this.year = value;  // error
        this._year= value;
    }
})

var descriptor = Object.getOwnPropertyDescriptor(person, 'year');
console.log(descriptor);    // {get: ?, set: ?, enumerable: true, configurable: true}

在原有的数据属性year中,使用Object.defineProperty()为属性设定get 或 set,都可以将其转换为拜访器属性。

拜访器属性 -> 数据属性

将拜访器属性转换为数据属性,只需要给现有拜访器属性设定value或writable这两个属性描写符中的任意一个即可,其原有的get和set就会被废弃,从而转换为数据属性。

上面为person定义的拜访器属性age,通过Object.defineProperty()只设定了get和set,所以configurable默许为false,不成以将其转换为数据属性。可以在拜访器属性和数据属性间彼此转化的属性其configurable特性值必需为true。

如下代码,我们为person新定义一个拜访器属性job,将其configurable设定为true ,并将其转换为数据属性:

Object.defineProperty(person, "job", {
    configurable: true,
    enumerable: true,
    get: function() {
        return this._job;
    },
    set: function(value) {
        this._job = value;
    }
})

// 设定value和writable其中任意一个即可转换为数据属性        
Object.defineProperty(person, "job", {
    value: 'worker',
    writable: true
})

var descriptor = Object.getOwnPropertyDescriptor(person, 'job');
console.log(descriptor);    // {value: "worker", writable: true, enumerable: true, configurable: true}

数据描写符value、writable 和拜访器描写符get、set不克不及同时设定,不然会报错。

Object.defineProperties()

通过Object.defineProperties()可以一次性为对象定义多个属性。

var person = {};
Object.defineProperties(person, {
  name: {
    value: 'Nicy',
    writable: true
  },
  _age: {
    value: 21,
    enumerable: true,
    writable: true,
    configurable: true
  },
   age: {
    get: function() {
    return this._age;
    },
    set: function(value) {
    this._age = value;
    }
  }
});

相关教程引荐:JavaScript视频教程

以上就是详解javascript对象的数据属性与拜访器属性的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有154人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板