JS标准库之Object对象

概述

JavaScript 原生提供Object对象(注意首字母O是大写),JS中所有其他对象都继承自Object对象,即那些对象都是 Object 的实例。

Object对象的原生方法分为两类:

  • Object 本身的方法:直接定义在 Object 对象的方法

    Object.print = function(o) { console.log(o) }
  • object 的实例方法:定义在 Object 原型对象 Object.prototype 上的方法,可以被 Object 实例直接使用。

    Object.prototype.print = function() {
    console.log(this);
    };
    var obj = new Object();
    obj.print();

Object()

Object本身是一个函数,可以当作工具方法使用,将任意值转为对象。常用于保证某个值一定是对象。

如果参数为空(或者为 undefinednull),则返回一个空对象。

var obj = Object();
// 等同于
var obj = Object(undefined);
var obj = Object(null);

obj instanceof Object; // true

构造函数

使用new命令,直接通过它来生成新对象。与上述工具方法用法相似。

var obj = new Object();

静态方法

指部署在 Object 对象自身的方法。

Object.keys(),Object.getOwnPropertyNames()

两种方法都用来遍历对象。

  • Object.keys()方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是集成的)所有属性名。
  • Object.getOwnPropertyNames()接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。
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 自动类型转换时会默认调用这个方法。

let obj = new Object();
console.log(1 + obj); // "1[object Object]"

上面代码将对象 obj 与数字 1 相加,这是 JavaScript 会默认调用valueOf方法,求出 obj 的值再与 1 相加。因此,如果自定义 valueOf 方法,就可以得到想要的结果。

let obj = new Object();
obj.valueOf = function () {
  return 2;
}
console.log(1 + obj); // 3

上面相当于用自定义obj.valueOf覆盖了Object.prototype.valueOf方法

Object.prototype.toString()

作用是返回一个对象的字符串形式,默认情况下返回类型字符串。

let obj = new Object(); 
console.log(obj.toString()); // "[object Object]"

直接使用返回类型字符串没有太大的用处,但是可以通过自定义toString方法,可以让对象在自动类型转换时,获得想要的字符串形式。

let obj = new Object();
obj.toString = function () {
  return 'hello';
}

console.log(obj + ' world'); // "hello world"

数组、字符串、函数、Date 对象都分别部署了自定义的toString方法,覆盖了Object.prototype.toString方法。

toString的应用:判断数据类型

var obj = {};
obj.toString(); // "[object Object]"

上面代码调用空对象的toString方法,结果返回一个object Object,其中第二个Object表示该值的构造函数。

由于实力对象可能会自定义toString方法,我们可以通过函数的call方法,直接使用对象的toString方法。

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运算符更准确的类型判断函数

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,用来返回针对某些地域的特定的值。目前,共有ArrayNumberDate进行了自定义。

目前,主要有三个对象自定义了toLocaleString方法。

  • Array.prototype.toLocaleString()
  • Number.prototype.toLocaleString()
  • Date.prototype.toLocaleString()

Object.prototype.hasOwnProperty()

接收一个字符串作为参数,返回一个布尔值,判断该实例对象自身是否具有该属性

let obj = {
  p: 123
}
console.log(obj.hasOwnProperty('p')); // true
console.log(obj.hasOwnProperty('toString')); // false

上面代码中,对象obj自身具有p属性,所以返回truetoString属性是继承的,所以返回false

这些信息可能会帮助到你: 关于我们 | 饿了么返钱 | 捐赠支持

文章名称:JS标准库之Object对象
文章链接:https://www.bysjb.cn/js-library-object.html
THE END
分享
二维码
打赏
< <上一篇
下一篇>>