首页 > 代码库 > 对象的属性
对象的属性
1.原型属性:
原型属性是用来继承原型对象的属性的。ES5里对象的创建有三种方法:
--直接量创建--将Object.prototype作为新对象的原型
--new 构造函数--将构造函数的prototype作为新对象原型
--Object.create(obj)传入一个原型对象,obj作为原型
ES5中可以通过Object.getPrototypeOf()查询某对象的原型;在ES3中通过不等价的方法:obj.constructor.prototype属性。
对于第一种创建对象方法,constructor指代Object()构造函数,因此constructor.prototype才是其原型(所有直接量创建的对象的原型都指向object.prototye)
对于第二种方法,constructor指向其构造函数
对于第三种创建对象方法,constructor指代Object()构造函数,但新对象的原型是传入的参数!
-----------------
要检测一个对象是否为另一个对象的原型,用isPrototypeOf()方法:
p.isPrototypeOf(o) --检测p是否为o的原型
2.class属性
该属性是一个字符串,表示对象的类型信息。
只有一种简洁的方法可以查询它:继承自Object.prototye的toString方法,返回:
[object class]
但由于很多对象的toString方法重写了,为了调用正确版本的toString(),只好间接地调用Function.call()。
Object.prototye.toString.call(obj) 判断obj属于哪种类型,比如判断是否为数组。
3.可扩展性
设置对象是否可扩展,可以固化对象的属性,即不可添加属性/方法。
4.特性属性
刚学JS的都知道对象是一组无序属性/值,属性的值可以是原始类型或对象类型,也可以是一个或一组getter、setter。
对象的属性可以分为存取器属性(accessor property)和数据属性(data
property)。除了名值外,属性还具有一些标识其可写、可枚举、可配置的特性。
对于数据属性,4个特性分别是:值、可写性、可枚举性、可配置性。
由getter、setter定义的属性叫存取器属性,getter、setter是函数。存取器属性不具有可写特性,getter和setter分别对应了其读写特性,另外两个特性是可枚举性、可配置性。
在ES3中,用户自定义属性都是可写、可枚举、可配置的,且这些特性不能修改。
ES5定义了一个“属性描述符”对象,代表属性的4个特性。其中writable、enumerable、configurable是布尔值。也定义了查询和设置这些特性的API:
--Object.getOwnpropertyDescriptor(obj,[key]);获取某对象的某属性的特性描述符,不存在或继承的属性返回undefined
--Object.getPropertyOf() 想获取继承属性的特性,只能遍历原型链
--Object.defineProperty(obj,[key],descriptorObj);设置对象的某属性的特性,只能修改自由属性
--Object.defineProperties(obj,keyDescObj)
第二个参数是一个对象形式映射,属性:描述符。
对象的属性