关于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(),将对象转换为原始值时会调用此方法,很多内置类也自定义了此方法
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(),将对象转换为原始值时会调用此方法,很多内置类也自定义了此方法
相关文章推荐
- 笔记 - JS易忘基础知识(二)(关于对象和继承)
- js 基础知识 对象与数组
- 关于一些基础的js对象的属性和方法问题
- 【脚本语言系列】关于Python基础知识对象变动,你知道的事
- JS中String对象与Array对象常用基础知识
- JS基础知识(上)(变量,条件判断语句,循环语句,函数,对象,数组)
- Three.js 开发基础知识 - 绘制3D对象
- 基础知识提问:关于HashTable和List两个容器Add改变了属性的同一对象的问题
- 笔记16--Js基础知识--日期和其他对象
- JS中BOM对象常用基础知识
- Python中关于字符串对象的一些基础知识
- 关于JS知识,string(字符串对象)
- JS基础知识梳理---location()对象
- js关于数组和对象基础
- js基础知识温习:js中的对象
- 关于JS的知识,Math(数学对象)
- 【学习】js学习笔记:对象的一些基础知识
- JavaScript数据类型及对象(js基础知识)
- js对象基础知识和程序设计
- js中Date对象与Math对象常用基础知识