9.3 操作属性

一、定义属性

  • 属性包含名和值。属性名可以是包含空字符串在内的任意字符串,属性值可以是任意JavaScript值。但对象中同一级别作用域不能存在两个同名的属性。
  • 除了名和值,每个属性还有一些相关的值,称为属性特性
    可写(writable attribute):表明是否可以设置该属性的值;
    可枚举(enumerable attribute):表明是否可以通过for/in循环返回该属性;
    可配置(configurable attribute):表明是否可以删除或者修改该属性;
  • 可以用冒号定义属性,冒号左侧是属性名,右侧是属性值;属性与属性之间用逗号运算符分隔;

1.定义属性的方式

  • 在对象结构体内定义属性
  • 使用点运算符在结构体外定义属性
var o={};
o.x=1;
o.y={
x:2,
y:true}//声明变量可以使用var语句,但是在声明对象属性时不能使用var语句
  • 使用构造函数定义属性
var o=function(){
this.x=1;
this.y={
x:1,
y:true}}
  • 两个静态函数(Object.defineProperty、Object.defineProperties),为指定对象定义属性。
    Object.defineProperty
    作用:添加新属性到对象,或者修改现有属性的特性
Object.defineProperty(object,propertyname,descriptor)
//参数说明:object,必须参数,指定要添加或者修改属性的对象;
//propertyname,必须参数,属性名称的字符串;
//descriptor,必须参数,定义属性的描述符,针对数据属性(value,writable,enumerable,configurable)或者访问器属性(set,get)
//Object.defineProperty返回值为修改后的对象
//将数据属性添加到对象中
        var obj={};
        Object.defineProperty(obj,"newOwnProperty",{
            value:101,
            writable:true,
            enumerable:true,
            configurable:true
        });
        obj.newOwnProperty=102;
        document.write(obj.newOwnProperty);
//将访问器属性添加到对象中
        var obj={};
        Object.defineProperty(obj,"newAccessProperty",{
            set:function(x){
                this.newavalue=x*x;
            },
            get:function(){
                return "<h1>"+this.newavalue+"</h1>"
            },
            enumerable:true,
            configurable:true
        });
        obj.newAccessProperty=30;
        document.write(obj.newAccessProperty);

Object.defineProperties
作用:向对象添加多个属性或者修改多个现有属性

Object.defineProperties(object,descriptors);
//参数说明:object,指定的对象;
//descriptors,必须参数,包含一个或者多个描述符对象,每个描述符对象描述一个数据属性或者访问器属性
        var obj={};
        Object.defineProperties(obj,{
            newDataProperty:{
                value:101,
                writable:true,
                enumerable:true,
                configurable:true
            },
            newAccessProperty:{
                set:function(x){
                    this.a=x+2;
                },
                get:function(){
                    return this.a;
                },
                enumerable:true,
                configurable:true
            }
        });
        obj.newAccessProperty=100;
        document.write(obj.newAccessProperty);

二、访问属性

1.通过点运算符访问属性。

  • 点运算符左侧是对象引用的变量,右侧是属性名(属性名是一个标识符,而不是一个字符串)
  • 对象属性与变量的工作方式相同,可以把属性看作对象的私有变量,用来存储数据

2.通过中括号访问属性

  • 以数组形式读取对象属性值时,应以字符串形式指定属性名,而不能使用标识符
var o={
x:1,
y:{
x:2,
y:{
x:3,
y:false}
}};
alert(o["y"]["y"]["y"]);

3.使用for/in语句遍历对象属性

var o={
    x:1,
    y:2,
    z:3
};
for(var i in o){
    alert(o[i])
}//使用for/in遍历对象属性时,应该使用数组操作方式来读取对象属性的值

4.ECMAScript 5 的4个访问对象属性的函数
Object.getPrototypeOf

  • 返回值是object的原型对象

Object.getOwnPropertyNames

  • 返回指定对象私有属性的名称
  • 返回值是一个数组
  • 包含可枚举和不可枚举的属性和方法的名称
  • 私有属性指的是直接对该对象定义的属性,而不是从对象的原型继承的属性

Object.keys

  • 与Object.getOwnPropertyNames类似,但是返回的是可枚举的属性和方法的名称
  • 返回值是一个数组

Object.getOwnPropertyDescriptor

Object.getOwnPropertyDescriptor(object,propertyname)
  • 返回值为属性的描述符
var obj={};
obj.newDataProperty="abc";
var desc1=Object.getOwnPropertyDescriptor(obj,"newDataProperty");
desc1.writable=false;
Object.defineProperty(obj,"newDataProperty",desc1);
var desc2=Object.getOwnPropertyDescriptor(obj,"newDataProperty");
for(var prop in desc2){
    document.write(prop+":"+desc2[prop]);
    document.write("<br/>")
}

三、赋值属性

  • 可以用点运算符和中括号运算符赋值属性
var o={
    x:1,
    y:2
}
o.x=3;
o["y"]=4;//数组操作法中括号中是字符串,而不是标识符
alert(o["x"]);
alert(o.y);

四、删除属性

  • 使用delete运算符删除属性
  • 从对象中彻底清除,而不是设置为undefined

五、对象的方法

  • 方法是一种特殊形式的属性,即值为函数的对象属性
  • 方法是对象执行特定行为的逻辑块,是与外界实现行为交互的动作
  • 使用小括号可以调用对象的方法
  • 对象方法内部的this指向调用方法的当前对象
  • 对象方法与普通函数用法完全相同,可以在方法中传递参数,可以设计返回值
var o={};
o.x=function(a){
    return 10*a;
}
var f=o.x(5);
alert(f);

六、配置特性

  • Object.preventExtensions(object)
    阻止对象添加新属性
  • Object.seal(object)
    阻止对象添加新属性,阻止修改特性
  • Object.freeze(object)
    组织对象添加新属性,阻止修改特性,阻止修改属性值
var obj={name:"haha",length:4};
Object.preventExtensions(obj);
obj.newprop=50;
obj.name=50;
document.write(obj.newprop);//返回undefined
document.write(obj.name);//返回50

七、检测特性

  • Object.isExtensible(object)
    如果对象是可拓展的,即可向对象添加新属性,则为true;否则为false
  • Object.isSealed(object)
    如果无法在对象中修改现有属性的特性,且无法添加新属性,则为true
  • Object.isFrozen(object)
    如果无法修改对象现有属性的特性和值,且无法添加新属性,则为true
var obj={pasta:"spaghetti",length:10};
if(!Object.isFrozen(obj)){
    obj.pasta=50;
}
Object.freeze(obj);
document.write(obj.pasta);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值