关于js对象的基础知识

    xiaoxiao2021-12-14  23

    一、对象属性的检测方法 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(),将对象转换为原始值时会调用此方法,很多内置类也自定义了此方法
    转载请注明原文地址: https://ju.6miu.com/read-962298.html

    最新回复(0)