JavaScript学习-对象

1, 介绍

  • ECMAScript中没有类的概念,因此它的对象也与基于类的语言中的对象有所不同。
  • ECMA-262对对象的定义:无序属性的集合,其属性可以包含基本值、对象或者函数。
  • 可以将ECMAScript的对象想象成散列表,名值对。

2,属性类型

  • ECMAScriptr定义只有内部采用的特性(attribute),描述属性的各种特征
  • 这些特性是为了实现JavaScript引擎用的,因此在JavaScript中不能直接访问它们。
  • 规范格式将它们放到两对儿方括号中,例:[[Enumerable]]。
  • ECMAScript中有两种属性:数据属性和访问器属性。

3,数据属性

数据属性有4个描述 其行为的特性。

  • [[Configurable]]:表示能否通过delete删除属性。默认值为true。
  • [[Emumerable]]:表示能否通过for-in循环返回属性,默认值true。
  • [[Writable]]:表示能否修改属性的值,默认为true。
  • [[Value]]:包含这个 属性的数据值,默认为undefined。

4,访问器属性

访问器属性包含一对儿getter和setter函数。

  • [[Configurable]]:同上。
  • [[Emumerable]]:同上。
  • [[Get]]:读取属性时调用的函数,默认为undefined。
  • [[Set]]:写入属性时滴啊用的函数,默认为undefined。
  • getter和setter
    只指定getter意味着属性时 不能写,在严格模式下,尝试写入只指定了getter函数的属性会抛出错误。类似的只指定setter的函数不能读。
  • 两个遗留方法
    可以实现和getter、setter同样的功能。
    • __defineGetter__()
    • __defineSetter__()

5,Object.defineProperty()方法

  • 参数
    • 属性所在的对象
    • 属性的名字
    • 描述符对象
      必须是configurable,enmerable,writable和value。
  • 代码示例:
var person = {};
Object.defineProperty(person,"name",{
    writable:false,
    value:"Nicholas"
});
alert(person.name); //Nicholas
person.name = "Greg";
alert(persion.name); // Nicholas
  • 上述代码中将configurable设置为false,若对这个属性调用delete,非严格模式下什么也不会发生,严格模式下回导致错误。而且一旦将属性定义为不可配置,就不能再将它变回可配置了,此时再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误。
  • 在调用Object.defineProperty()方法时,如果不指定,configurable,enumerable和writable特性默认都是false。

6,Object.definePropertys()方法

通过描述符一次定义 多个属性。
接收两个参数:

  • 第一个对象是要添加和修改其属性的对象。
  • 第二个对象的属性与第一个对象中要添加或修改的属性一一对应。

7,Object.getOwnpropertyDescriptor()

取得给定属性的描述符,接收两个参数:

  • 属性所在的对象
  • 读取其描述符的属性名称。
  • 代码示例

    var book = {};
    Object.defineProperties(book,{
        _year:{
    
            value:2017
        },
        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
    aler(typeof descriptor.get); // undefined
    
    var descriptor = Object.getOwnpropertyDescriptor(book,"year");
    alert(descriptor.value); // undefined
    alert(descriptor.enumerable);// false
    alert(typeof descriptor.get);// function
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值