原生JS:Object对象详细参考

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 }]
上一篇:点/边 双连通分量---Tarjan算法


下一篇:LOJ #2587「APIO2018」铁人两项