您的位置:首页 > Web前端 > JavaScript

关于js对象的基础知识

2016-12-02 10:38 363 查看
一、对象属性的检测方法
1、in 运算符
2、hasOwnProperty()检测自有属性    (只有是自有属性才返回true)
3、propertyIsEnumerable()  检测可枚举的自有属性      (只有是可枚举的自有属性才返回true    注:对象继承的内置方法不可枚举)
4、!== 检测属性是否是undefined     (这种方法不能检测属性值为undefined)

*注:1、!==可以区分null和undefined,而!=不可以
        2、如果属性值为undefined ,可以用in来进行检测
        3、如果一个对象中存在相同的属性名,则后定义的属性值将覆盖掉之前的属性值
        4、ES5提供的两个函数:Object.keys(obj)返回的是对象的可枚举的属性名组成的数组      Object.getOwnPropertyNames(obj)返回的是对象的所有自有属性名称组成的数组

二、枚举属性
1、for/in  枚举对象的属性

*注:in运算符可以检测自有和继承的属性,但for/in只能遍历出自有和继承的可枚举的属性
        eg:var o = {x:1};
               toString in o;   //返回true
               for(pro in o){
               console.log(pro);          //输出x ,却不会输出toString,因为toString不可枚举
               }
三、存取器属性 getter 和setter(其他为数据属性)

定义:var obj = {
          attr:value, //普通数据属性
          get fun(){函数体},
          set fun(value){函数体},       //get和set方法名相同,且没有冒号,之间用逗号分开
          attr1:value1,
}
obj.fun = 3;  //调用set方法,并传参赋值    ,返回值为undefined
obj.fun;   //调用get方法,无需参数   有返回值

四、属性的特性
1、数据属性的特性有四个:value(属性值)、writable(可写性)、enumerable(可枚举性)、configurable(可配置性)
2、存取器属性的特性有四个:get(可读)、set(可写)(是否可写看它是否有set方法)、enumerable(可枚举性)、configurable(可配置性)

3、为了描述属性的特性,ES5定义了一个“属性描述符(property descriptor)”的对象,该对象有四个属性,属性名和特性名相同

调用Object.getOwnPropertyDescriptor()可以获取对象特定属性的属性描述符   

*注:getOwnPropertyDescriptor只能获取自有属性的属性描述符,不能获取继承的属性的属性描述符,
要想获取继承的属性的属性描述符就需要遍历原型链,Object.getPrototypeOf()

eg:console.log(Object.getOwnPropertyDescriptor(obj,"attr"))    //返回值自己测试一下即可得到

4、设置属性的特性
Object.defineProperty(对象,属性,属性描述符) ,属性描述符 不用四个都传,且对于新建的属性默认的特性值为false或undefined。Object.defineProperties()设置或修改对象的多个属性

*注:1、如果一个属性是不可写的但它是可配置的,就可以通过defineProperty来修改属性值
        2、defineProperty可以将数据属性转换成存取器属性
        3、defineProperty只能修改自有属性

五、对象的三个属性

1、原型属性
     通过对象直接量创建的对象,它的原型是Project.prototype
     通过构造函数new出来的对象,它的原型是构造函数.prototype
     通过Project.create创造出来的对象,它的原型是它的第一个参数

*注:  1、ES5中用Project.getPrototypeOf()来查询对象的原型,ES3中多用o.constructor.prototype来检测对象的原型
          2、可以用p.isPrototypeOf(o)来检测p是否是o的原型或处于o的原型链中  类似于运算符instanceof

2、类属性
到ES5为止,没有提供设置这个属性的方法,但可以间接的查询对象的类型性,即调用对象的toString()方法并截取返回的字符串的第8位至倒数第二位的字符,注意很多对象都会重写继承的toString()方法,所以我们要间接的调用Function.call()方法

*注:Object.prototype.toString返回的是[Object class]这种格式的字符串

3、可扩展性
可扩展性就是指是否可以给对象添加新属性,在ES5中,所有内置对象和自定义对象都是可扩展的
ES5定义了Object.esExtensible(o)查询对象的可扩展性,Object.preventExtensions(o)可将对象转换为不可扩展的,并且这个转化是单向的,转化成不可扩展的就不能再转化回来了
*注:这个函数只影响对象本身,如果给这个对象的原型添加新属性,该对象仍然会继承这些新属性
        ES5定义了一些函数,这些函数是结合了对象的不可扩展和属性的不可配置等功能,实现了对象的“锁定”
        eg:1、Object.seal(o)    //它将对象设置为不可扩展的,并且将对象的自有属性设置为不可配置的,但控制不了属性的可写性,并且锁住了就不能进行解锁了,可以用Object.isSealed()进行检查封锁性
               2、Object.freeze(o)   //更加严格的锁定,它设置对象为不可扩展,属性不可配置,不可写,变成只读的(存取器属性不受影响,getter和setter正常调用)

六、序列化对象
指将对象的状态转化为字符串
ES5定义了JSON.stringify()和JSON.parse()来序列化和还原js对象,都是以json格式进行转化的

七、对象方法
1、toString(),默认的对象的toString()方法返回值只是检测对象的类型,所以很多类都有自定义的toString方法
2、toLocalString(),Object对toLocalString()没有做本地化处理,返回的和toString()一样,只有Date和Number类对toLocalString()进行了定制
3、toJSON(),Object.prototype实际上没有定义该方法,但在对象序列化时就会自动调用此方法
4、valueOf(),将对象转换为原始值时会调用此方法,很多内置类也自定义了此方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: