Object对象详细参考
本文参考MDN做的详细整理,方便大家参考MDN
JavaScript原生提供一个Object对象(注意起首的O是大写),所有其他对象都继承自这个对象。
构造函数:
Object 构造函数为给定的值创建一个对象包装。
如果给定值是 null or undefined,将会创建并返回一个空对象
否则,将返回一个与给定值对应类型的对象。
当以非构造函数形式被调用时,Object() 等同于 new Object()。
var o1 = new Object();//创建空对象,等同:var o1 = {};
Object()方法:
Object本身当作工具方法使用时,可以将任意值转为对象。如果参数是原始类型的值,Object方法返回对应的包装对象的实例。
Object() // 返回一个空对象
Object(undefined) // 返回一个空对象
Object(null) // 返回一个空对象
Object('foo') instanceof String // true
Object(o1) === o1// true 如果Object方法的参数是一个对象,它总是返回原对象
if( obj === Object(obj) ) //这个方法常用于判断某个值是否是对象。
属性:
Object.length 值为1。
Object.prototype 可以为所有 Object 类型的对象添加属性。
属性描述符:本文最后又详细说明
Object 对象的静态方法:
所谓“静态方法”,是指部署在对象自身的方法。在 ES5 中,如果参数不是一个对象类型,将抛出一个 TypeError 异常。在 ES6 中, non-object 参数将被视为一个不可扩展的普通对象,因此会返回 false 。
常用方法:
1)对象属性模型的相关方法
Object.getOwnPropertyDescriptor():获取某个属性的attributes对象。
Object.defineProperty():通过attributes对象,定义某个属性。
Object.defineProperties():通过attributes对象,定义多个属性。
Object.getOwnPropertyNames():返回直接定义在某个对象上面的全部属性的名称。
(2)控制对象状态的方法
Object.preventExtensions():防止对象扩展。
Object.isExtensible():判断对象是否可扩展。
Object.seal():禁止对象配置。
Object.isSealed():判断一个对象是否可配置。
Object.freeze():冻结一个对象。
Object.isFrozen():判断一个对象是否被冻结。
(3)原型链相关方法
Object.create():生成一个新对象,并该对象的原型。
Object.getPrototypeOf():获取对象的Prototype对象。
Object.assign(target, ...sources) IE不支持
把任意多个的源对象sources自身的可枚举属性浅拷贝给目标对象,然后返回目标对象target,若属性名重复则抛出异常打断接下来的拷贝任务,Object.assign 会跳过那些值为 null 或 undefined 的源对象。
Object.create(proto, [ propertiesObject ]) IE9
创建一个拥有指定的原型对象proto和可选的属性描述符对象propertiesObject
如果 proto 参数不是 null 或一个对象值,则抛出一个 TypeError 异常。
属性描述符对象propertiesObject不能是 undefined,另外只有该对象中自有的可枚举的属性才有效,也就是说该对象的原型链上属性是无效的。
//创建一个以另一个空对象为原型,且拥有一个可写的,可枚举的,不可配置的属性p,省略了的属性特性默认为false
var o2 = Object.create({}, { p: { value: 42, writable: true, enumerable: true } });
Object.defineProperty(obj, property, descriptor) IE9(IE8部分支持)
精确地给对象obj添加或修改一个自有属性property,详细指定该属性的配置对象descriptor,最后返回这个对象obj。
一般情况下,我们为对象添加属性是通过赋值来创建并显示在属性枚举中(for...in 或 Object.keys 方法), 但这种方式添加的属性值可以被改变,也可以被删除。
而使用 Object.defineProperty() 则允许改变这些额外细节的默认设置。例如,默认情况下,使用 Object.defineProperty() 增加的属性值是不可改变的。
Object.defineProperties(obj, props) IE9
在一个对象obj上添加或修改一个或者多个自有属性,并分别指定它们的配置。返回该对象。参数props是该对象的一个或多个键值对,值为将要为对象添加或修改的属性的具体配置
Object.getOwnPropertyDescriptor(obj, prop) IE8
返回指定对象obj上一个自有属性对应的属性描述符对象prop。否则返回 undefined
Object.keys() IE9
返回一个数组,包含指定对象的所有自有可枚举的属性的名称。
Object.getOwnPropertyNames(obj) IE9
返回一个包含了指定对象所有自有的属性名的数组(包含不可枚举的属性)。
该数组中枚举属性的顺序与通过 for...in loop(或 Object.keys)迭代该对象属性时一致,而数组中不可枚举属性的顺序未定义。
Object.getOwnPropertySymbols(obj) ES6
返回一个数组,它包含了指定对象自身所有的符号属性(symbol 属性键)。
Object.getPrototypeOf(obj) IE9
返回指定对象obj的原型对象obj.prototype。
Object.is(value1, value2) IE Safari 无
判断两个值是否严格相等。(类似===运算符,但+0不等于-0,NaN等于自己)。
Object.freeze(obj) IE9
冻结对象:冻结对象obj的所有自身属性都不可能以任何方式被修改(不管是数据属性还是访问器属性)。任何尝试修改该对象的操作都会失败,可能是静默失败,也可能会抛出异常(严格模式中)。如果一个属性的值是个对象,则这个对象中的属性是可以修改的,除非它也是个冻结对象。
Object.isFrozen() IE9 ,但Opera无
判断对象是否已经冻结。一个对象是冻结的(frozen)是指它不可扩展,所有属性都是不可配置的(non-configurable),且所有数据属性(data properties)都是不可写的(non-writable)
Object.isSealed() IE9 ,但Opera无
判断对象是否已经密封。密封对象是指那些不可 扩展 的,且所有自身属性都不可配置的(non-configurable)且属性不可删除的对象(其可以是可写的)。
Object.isExtensible(obj) IE9
判断对象是否可扩展(是否可以在它上面添加新的属性)。Object.preventExtensions,Object.seal 或 Object.freeze 方法都可以标记一个对象为不可扩展。
Object.preventExtensions(obj) IE9 ,但Opera无
让一个对象变的不可扩展,也就是永远不能再添加新的属性。
不可扩展的对象的属性通常仍然可以被删除。
尝试给一个不可扩展对象添加新属性的操作将会失败,不过可能是静默失败,也可能会抛出 TypeError 异常(严格模式)。
Object.preventExtensions 只能阻止一个对象不能再添加新的自身属性,仍然可以为该对象的原型添加属性。
Object.seal() IE9 ,但Opera无
密封对象以防属性被删除,不会影响从原型链上继承的属性。但自身的__proto__属性的值也会不能修改。返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象
Object.setPrototypeOf(obj, prototype) ES6 IE11 但Safari无
将一个指定的对象的原型设置为另一个对象或者null(既对象的[[Prototype]]内部属性)。如果对象的[[Prototype]]被修改成不可扩展,就会抛出 TypeError异常。如果prototype参数不是一个对象或者null(例如,数字,字符串,boolean,或者 undefined),则什么都不做。否则,该方法将obj的[[Prototype]]修改为新的值。
Object.values() ES7
返回一个包含指定对象所有的可枚举属性值的数组
Object对象的实例属性:
所有对象都会从它的原型上继承一个 constructor 属性
Object.prototype.constructor
返回一个指向创建了该对象原型的函数引用。需要注意的是,该属性的值是那个函数本身,而不是一个包含函数名称的字符串。
Object对象的实例方法:
部署在Object.prototype对象上的,所有Object的实例对象都继承了这些方法
Object.prototype.hasOwnProperty()
返回一个布尔值 ,用来判断某个对象是否含有指定的自身属性。和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性。
Object.prototype.isPrototypeOf(obj)
返回一个布尔值,检测指定对象obj是否在本对象的原型链中。
Object.prototype.propertyIsEnumerable(propty)
判断指定属性是否可枚举。每个对象都有 propertyIsEnumerable 方法。该方法可以判断出指定对象里的属性是否可枚举,也就是说该属性是否可以通过 for...in 循环等遍历到,不过继承的可枚举属性可以通过 for...in 循环遍历到,所以对于继承属性该方法会返回false。如果对象没有指定的属性,该方法返回 false。
Object.prototype.toLocaleString()
直接调用 toString()方法。覆盖了 toLocaleString() 方法的对象:
Array: Array.prototype.toLocaleString()
Number: Number.prototype.toLocaleString()
Date: Date.prototype.toLocaleString()
Object.prototype.toString()
返回对象的字符串表示。
Object.prototype.valueOf()
返回指定对象的原始值。
不同数据类型的Object.prototype.toString方法返回值如下:
数值:返回[object Number]。
字符串:返回[object String]。
布尔值:返回[object Boolean]。
undefined:返回[object Undefined]。
null:返回[object Null]。
数组:返回[object Array]。
arguments对象:返回[object Arguments]。
函数:返回[object Function]。
Error对象:返回[object Error]。
Date对象:返回[object Date]。
RegExp对象:返回[object RegExp]。
其他对象:返回[object " + 构造函数的名称 + "]。
也就是说,Object.prototype.toString可以得到一个实例对象的构造函数
利用这个特性,可以写出一个比typeof运算符更准确的类型判断函数:
var type = function (o){
var s = Object.prototype.toString.call(o);
return s.match(/\\[object (.*?)\\]/)[1].toLowerCase();
};
type({}); // "object"
type([]); // "array"
type(5); // "number"
type(null); // "null"
type(); // "undefined"
type(/abcd/); // "regex"
type(new Date()); // "date"
在上面这个type函数的基础上,还可以加上专门判断某种类型数据的方法:
['Null',
'Undefined',
'Object',
'Array',
'String',
'Number',
'Boolean',
'Function',
'RegExp',
'NaN',
'Infinite'
].forEach(function (t) {
type['is' + t] = function (o) {
return type(o) === t.toLowerCase();
};
});
type.isObject({}) // true
type.isNumber(NaN) // true
type.isRegExp(/abc/) // true
属性描述符:
在 Javascript 中, 属性 由一个字符串类型的“名字”(name)和一个“属性描述符”(property descriptor)对象构成。
描述符必须是两种形式之一:数据描述符和存取描述符。数据描述符是一个拥有value-writable可写或不可写值的属性。存取描述符是由一对 get-set 函数功能来描述的属性。它们的默认值是undefined,而其它两个可选的属性enumerable,configurable的默认值是false
value
writable 当且仅当该属性的 writable 为 true 时,该属性才能被赋值运算符改变。默认为 false。
get
set 一个给属性提供 setter 的方法,如果没有 setter 则为 undefined。该方法将接受唯一参数,并将该参数的新值分配给该属性。默认为 undefined。
属性特性 configurable 表示对象的属性是否可以被删除,如果 configurable 特性为false,那么 writable 只能从true该为false外,其他特性都不能被修改,并且数据和存取描述符也不能相互切换。若尝试修改为不同的值,则抛出TypeError异常
属性特性 enumerable 定义了对象的属性是否可以在 for...in 循环和 Object.keys() 中被枚举。
这些选项不一定是自身属性,如果是继承来的也要考虑。为了确认保留这些默认值,你可能要在这之前冻结 Object.prototype,明确指定所有的选项,或者将__proto__属性指向null。
var o = {};
o.a = 1;
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : true,
configurable : true,
enumerable : true
});
// 另一方面,
Object.defineProperty(o, "a", { value : 1 });
// 等同于 :
Object.defineProperty(o, "a", {
value : 1,
writable : false,
configurable : false,
enumerable : false
});
function Archiver() {
var temperature = null;
var archive = [];
Object.defineProperty(this, \'temperature\', {
get: function() {
return temperature;
},
set: function(value) {
temperature = value;
archive.push({ val: temperature });
},
enumerable:true,
configurable:true //可省略
});
this.getArchive = function() { return archive; };
}
var arc = new Archiver();
console.log(arc.archive);//undefined
arc.temperature = 11;
console.log(arc.temperature); //11
arc.getArchive(); // [{ val: 11 }]