资讯专栏INFORMATION COLUMN

对象属性

ispring / 3186人阅读

摘要:作用修改属性默认的特性参数属性所在的对象属性的名字和一个描述符对象。描述符对象的属性必须是和。这个方法接收两个参数属性所在的对象和要读取器描述符的属性名称。

属性的类型

ECMA-262 第 5 版在定义只有内部才用的特性(attribute)时,描述了属性(property)的各种特征。定义这些属性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们。为了我表示特性是内部值,改规范把它们放在了两对儿方括号中,例如[[Enumerable]]。

ECMAScript 中有两种属性:数据属性和访问器属性

1.数据属性

数据属性包含一个数据值的位置。在这个位置可以读取和写入值。数据属性有 4 个描述其行为的特性。

[[Configurable]]:表示能否通过 delete 删除属性从而重新定义属性,能否修改属性的特性,或者能否把属性修改为访问器属性。直接在对象上定义的属性,它们的这个特性默认值为 true。

[[Enumerable]]:表示能否通过 for-in 循环返回属性。直接在对象上义的属性,它们的这个特性默认值为 true。

[[Writable]]:表示能否修改属性的值。直接在对象上定义的属性,它们的这个特性默认值为 true。

[[Value]]:包含这个属性的数据值。读取属性值的时候,从这个位置读;写入属性值的时候,新值保存在这个位置。这个特性的默认值为 undefined。

Object.defineProperty()

作用:修改属性默认的特性
参数:属性所在的对象、属性的名字、和一个描述符对象。描述符对象的属性必须是configurable、enumerable、writable 和 value。

Object.defineProperty(person, "name", { 
     writable: false, 
     value: "Nicholas" 
}); 
alert(person.name); //"Nicholas" 
person.name = "Greg"; 
alert(person.name); //"Nicholas"

一旦把configurable属性定义为不可配置的,就不能再把它变回可配置了。此时,再调用 Object.defineProperty()方法修改除 writable 之外
的特性,都会导致错误

var person = {}; 
Object.defineProperty(person, "name", { 
    configurable: false, 
    value: "Nicholas" 
}); 
//抛出错误
Object.defineProperty(person, "name", { 
    configurable: true, 
    value: "Nicholas" 
});

在调用 Object.defineProperty()方法时,如果不指定,configurable、enumerable 和writable 特性的默认值都是 false(未调用改方法时默认值都为true)

2. 访问器属性

访问器属性不含数据值;他们包含一对儿getter和setter函数(不是必需的)。在读取访问器属性时,会调用getter函数,这个函数负责返回有效的值;在写入访问器属性时,会调用setter函数并传入新值。这个函数负责如何处理数据

访问器的四个属性:

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

[[Enumerable]]:表示能否通过 for-in 循环返回属性。对于直接在对象上定义的属性,这个特性的默认值为 true。

[[Get]]:在读取属性时调用的函数。默认值为 undefined。

[[Set]]:在写入属性时调用的函数。默认值为 undefined。

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

var book = { 
     _year: 2004,     //下划线是一种常用的记号,用于表示只能通过对象方法访问的属性
     edition: 1 
}; 
Object.defineProperty(book, "year", { 
     get: function(){ 
         return this._year; 
     }, 
    set: function(newValue){ 
        if (newValue > 2004) { 
            this._year = newValue; 
            this.edition += newValue - 2004; 
        } 
    } 
}); 
book.year = 2005; 
alert(book.edition); //2

支持 ECMAScript 5 的这个方法的浏览器有 IE9+(IE8 只是部分实现)、Firefox 4+、Safari 5+、Opera 12+ 和 Chrome 。在这个方法之前,要创建访问器属性,一般都使用两个非标准的方法:__defineGetter__()和__defineSetter__()。这两个方法最初是由 Firefox 引入的,后来 Safari 3、Chrome 1 和 Opera 9.5 也给出了相同的实现

var book = { 
     _year: 2004, 
     edition: 1 
}; 
//定义访问器的旧有方法
book.__defineGetter__("year", function(){ 
     return this._year; 
}); 
book.__defineSetter__("year", function(newValue){ 
 if (newValue > 2004) { 
     this._year = newValue; 
     this.edition += newValue - 2004; 
 } 
}); 
book.year = 2005; 
alert(book.edition); //2 
AccessorPropertiesExample02.htm 
在不支持 Object.defineProperty() 方法的浏览器中不能修改 [[Configurable]] 和 [[Enumerable]]。  
  
2 定义多个属性

Object.defineProperties()方法,利用这个方法可以通过描述符一次定义多个属性。这个方法接收两个对象参数:第一个对象是要添加和修改器属性的对象,第二个对象的属性和第一个对象中要添加或修改的属性一一对象。

var book = {}; 
Object.defineProperties(book, { 
    _year: { 
        value: 2004 
    }, 
    edition: { 
        value: 1 
    }, 
    year: { 
        get: function(){

             return this._year; 
        }, 
        set: function(newValue){ 
            if (newValue > 2004) { 
                this._year = newValue; 
                this.edition += newValue - 2004; 
            } 
        } 
    } 
});
3 读取属性的特性

Object.getOwnPropertyDescriptor()方法,可以取得给定属性的描述符。这个方法接收两个参数: 属性所在的对象和要读取器描述符的属性名称。返回值是一个对象,如果是访问器属性,这个对象的属性有configurable、enumerable、get 和 set;如果是数据属性,这个对象的属性有 configurable、enumerable、writable 和 value。

var book = {}; 
Object.defineProperties(book, { 
     _year: { 
         value: 2004 
     }, 
     edition: { 
         value: 1 
     }, 
     year: { 
         get: function(){ 
             return this._year; 
         }, 
         set: function(newValue){ 
             if (newValue > 2004) { 
                 this._year = newValue; 
                 this.edition += newValue - 2004; 
             } 
         } 
     } 
}); 
var descriptor = Object.getOwnPropertyDescriptor(book, "_year"); 
alert(descriptor.value); //2004 
alert(descriptor.configurable); //false

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/103465.html

相关文章

  • 犀牛书——CHAP6:对象

    摘要:对象是属性的无序集合。使用对象直接量创建的对象的原型就是,使用运算符创建的对象的原型是构造函数的的值。主要目的是将对象锁定,避免外界干扰。判断对象是否封闭。删除属性可删除对象的自有属性且为的属性。 对象是属性的无序集合。因此,这一章主要从对象和属性两个方面来阐述。showImg(https://box.worktile.com/view/c8f5f376fe314aeca69d9b4c...

    philadelphia 评论0 收藏0
  • 关于JavaScript对象,你所不知道的事(二)- 再说属性

    摘要:但好在还给我们提供了一个方法,每一个对象都有这样一个方法,专门用来判断某个属性是否是该对象的私有属性。如果你想要用对象字面形式,你只能在创建对象时定义访问器属性。在中,我们使用冻结一个对象,并且使用来判断一个对象是否被冻结。 说完了对象那些不常用的冷知识,是时候来看看JavaScript中对象属性有哪些有意思的东西了。 不出你所料,对象属性自然也有其相应的特征属性,但是这个话题有点复杂...

    Richard_Gao 评论0 收藏0
  • JavaScript || 对象

    摘要:通过对返回字符串切片第位到倒数第位即可获得对象的类型。测试对象是的深拷贝是的子集,不能表示中所有值。序列化结果是,对象序列化结果是日期字符串不能表示函数对象和只能序列化对象自有的可枚举属性。 对象 对象是JavaScript的基本数据类型:属性的无序集合。每个属性key: value和属性描述符descripter组成。 属性名key:字符串或合法的变量标识符; 属性值value:...

    lavor 评论0 收藏0
  • JavaScript之对象属性

    摘要:尽管的右操作数是构造函数,但计算过程实际是检测了对象的继承关系。通过创建的对象使用构造函数的属性作为它们的原型。 JavaScript之对象属性 Object.create()继承 ECMAScript 5定义了一个名为Object.create()的方法,它创建一个新对象, 其中第一个参数是这个对象的原型。Object.create()提供第二个可选参数,用以对对象的属性进行进一步描...

    gekylin 评论0 收藏0
  • 《JavaScript 闯关记》之对象

    摘要:属性名可以是包含空字符串在内的任意字符串,但对象中不能存在两个同名的属性。客户端中表示网页结构的对象均是宿主对象。这里的函数称做构造函数,构造函数用以初始化一个新创建的对象。通过关键字和构造函数调用创建的对象的原型就是构造函数的属性的值。 对象是 JavaScript 的数据类型。它将很多值(原始值或者其他对象)聚合在一起,可通过名字访问这些值,因此我们可以把它看成是从字符串到值的映射...

    rozbo 评论0 收藏0
  • JavaScript-对象

    摘要:对象是什么在中,一个对象就像一个单独拥有属性和类型的实体。一个杯子作为一个对象,杯子有颜色重量等属性。同样,对象也有属性定义它的特征。方法是关联到某个对象的函数,或者说,一个方法是一个值为某个函数的对象属性。 对象是什么 在JavaScript中,一个对象就像一个单独拥有属性和类型的实体。一个杯子作为一个对象,杯子有颜色、重量等属性。同样,JavaScript对象也有属性定义它的特征。...

    xeblog 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<