JS标准库之Object对象
概述
JavaScript 原生提供Object
对象(注意首字母O
是大写),JS中所有其他对象都继承自Object
对象,即那些对象都是 Object
的实例。
Object
对象的原生方法分为两类:
-
Object
本身的方法:直接定义在 Object 对象的方法1Object.print = function(o) { console.log(o) } object
的实例方法:定义在Object
原型对象Object.prototype
上的方法,可以被Object
实例直接使用。12345Object.prototype.print = function() {console.log(this);};var obj = new Object();obj.print();
Object()
Object
本身是一个函数,可以当作工具方法使用,将任意值转为对象。常用于保证某个值一定是对象。
如果参数为空(或者为 undefined
和 null
),则返回一个空对象。
1 2 3 4 5 6 |
var obj = Object(); // 等同于 var obj = Object(undefined); var obj = Object(null); obj instanceof Object; // true |
构造函数
使用new
命令,直接通过它来生成新对象。与上述工具方法用法相似。
1 |
var obj = new Object(); |
静态方法
指部署在 Object
对象自身的方法。
Object.keys(),Object.getOwnPropertyNames()
两种方法都用来遍历对象。
Object.keys()
方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是集成的)所有属性名。Object.getOwnPropertyNames()
接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。
1 2 3 4 5 6 7 |
var obj = { p1: 123, p2: 456 } Object.keys(obj); // ["p1", "p2"] object.getOwnPropertyNames(obj); // ["p1", "p2"] |
一般情况下,几乎总是使用Object.keys
方法,遍历对象的属性。只有当需要遍历不可枚举属性时,才使用Object.getOwnPropertyNames
方法。
其他方法
1. 对象属性模型的相关方法
Object.getOwnPropertyDescriptor()
:获取某个属性的描述对象。Object.defineProperty()
:通过描述对象,定义某个属性。Object.defineProperties()
:通过描述对象,定义多个属性。
2. 控制对象状态的方法
Object.preventExtensions()
:防止对象扩展。Object.isExtensible()
:判断对象是否可扩展。Object.seal()
:禁止对象配置。Object.isSealed()
:判断一个对象是否可配置。Object.freeze()
:冻结一个对象。Object.isFrozen()
:判断一个对象是否被冻结。
3. 原型链相关方法
Object.create()
:该方法可以指定原型对象和属性,返回一个新的对象。Object.getPrototypeOf()
:获取对象的Prototype
对象。
实例方法
指定义在Object.prototype
对象的方法,所有Object
的实例对象都继承这些方法。主要有以下六个
Object.prototype.valueOf()
:返回当前对象对应的值。Object.prototype.toString()
:返回当前对象对应的字符串形式。Object.prototype.toLocaleString()
:返回当前对象对应的本地字符串形式。Object.prototype.hasOwnProperty()
:判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性。Object.prototype.isPrototypeOf()
:判断当前对象是否为另一个对象的原型。Object.prototype.propertyIsEnumerable()
:判断某个属性是否可枚举。
Object.prototype.valueOf()
作用是返回一个对象的“值”,默认情况下返回对象本身。主要用途是 JS 自动类型转换时会默认调用这个方法。
1 2 |
let obj = new Object(); console.log(1 + obj); // "1[object Object]" |
上面代码将对象 obj
与数字 1 相加,这是 JavaScript 会默认调用valueOf
方法,求出 obj
的值再与 1 相加。因此,如果自定义 valueOf
方法,就可以得到想要的结果。
1 2 3 4 5 |
let obj = new Object(); obj.valueOf = function () { return 2; } console.log(1 + obj); // 3 |
上面相当于用自定义obj.valueOf
覆盖了Object.prototype.valueOf
方法
Object.prototype.toString()
作用是返回一个对象的字符串形式,默认情况下返回类型字符串。
1 2 |
let obj = new Object(); console.log(obj.toString()); // "[object Object]" |
直接使用返回类型字符串没有太大的用处,但是可以通过自定义toString
方法,可以让对象在自动类型转换时,获得想要的字符串形式。
1 2 3 4 5 6 |
let obj = new Object(); obj.toString = function () { return 'hello'; } console.log(obj + ' world'); // "hello world" |
数组、字符串、函数、Date 对象都分别部署了自定义的toString
方法,覆盖了Object.prototype.toString
方法。
toString的应用:判断数据类型
1 2 |
var obj = {}; obj.toString(); // "[object Object]" |
上面代码调用空对象的toString
方法,结果返回一个object Object
,其中第二个Object
表示该值的构造函数。
由于实力对象可能会自定义toString
方法,我们可以通过函数的call
方法,直接使用对象的toString
方法。
1 |
Object.prototype.toString.call(value); |
不同数据类型的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]
。
这就是说,Object.prototype.toString
可以看出一个值到底是什么类型。利用这个特性,可以写一个比typeof
运算符更准确的类型判断函数
1 2 3 4 5 6 7 |
let type = function (o) { let s = Object.prototype.toString.call(o); return s.match(/\[object (.*?)\]/)[1].toLowerCase(); } console.log(type({})); // "object" console.log(type(null)); // "null" |
Object.prototype.toLocaleString()
Object.prototype.toLocaleString()
方法与toString
的返回结果相同,也是返回一个值的类型字符串。
主要作用是留出一个接口,让其他的对象实现自己版本的toLocaleString
,用来返回针对某些地域的特定的值。目前,共有Array
、Number
和Date
进行了自定义。
目前,主要有三个对象自定义了toLocaleString
方法。
- Array.prototype.toLocaleString()
- Number.prototype.toLocaleString()
- Date.prototype.toLocaleString()
Object.prototype.hasOwnProperty()
接收一个字符串作为参数,返回一个布尔值,判断该实例对象自身是否具有该属性。
1 2 3 4 5 |
let obj = { p: 123 } console.log(obj.hasOwnProperty('p')); // true console.log(obj.hasOwnProperty('toString')); // false |
上面代码中,对象obj
自身具有p
属性,所以返回true
。toString
属性是继承的,所以返回false
。