3

前言

  • JavaScript原生提供Object对象
  • JavaScript的所有其他对象都继承自Object对象,即这些对象都是Object的实例
  • Object对象的原生方法分为两类:Object本身的方法、Object的实例方法

Object对象本身的方法

直接定义在Object对象的方法
Object.print = function (o) {
    console.log(o);
}

print方法就是直接定义在Object对象上

Object的实例方法

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

var obj = new Object();
obj.print() // Object

Object.prototype定义了一个print方法,然后生成一个Object的实例obj,obj直接继承了Object.prototype的属性和方法,所以可以直接使用obj.print调用print方法,实质上就是obj对象的print方法就是调用Object.prototype.print方法

凡是定义在Object.prototype对象上面的属性和方法,将被所有实例对象共享

Object()

Object本身是一个函数,可以当作工具方法使用,将任意值转为对象

此方法常用于保证某个值一定是对象

1、Object()返回一个空对象

var obj = Object();
// 等同于下面两条语句
var obj = Object(undefined);
var obj = Object(null);
obj instanceof Object // true
  • Object()返回一个空对象
  • instanceof运算符验证,一个对象是否为指定的构造函数的实例,obj对象时Object的实例

2、如果参数是原始类型的值,Object()将其转为对应的包装对象的实例

var obj = Object(1);
obj instanceof Object // true
obj instanceof Number // true

var obj = Object('foo');
obj instanceof Object // true
obj instanceof String // true

3、如果参数是一个对象,则总是返回该对象,不用转换

var arr = [];
var obj = Object(arr); // 返回原数组
obj === arr // true

var fn = function() {};
var obj = Object(fn); // 返回原函数
obj === fn // true

// 一个判断变量是否为对象的函数
function isObject(value) {
    return value === Object(value);
}
isObject([]) // true
isObject(true) // false

Object构造函数

通过var obj = new Object()的写法生成新对象,与字面量的写法var obj = {}是等价的

构造函数的用法与工具方法相同点

  • 使用时,可以接受一个参数,如果该参数是一个对象,则直接返回这个对象,如果是一个原始类型的值,则返回该值对应的包装对象

       var o1 = {a: 1};
       var o2 = new Object(o1);
       o1 === o1 // true 
    
       var obj = new Object(123);
       obj instanceof Number // true

构造函数的用法与工具方法不同点

  • Object(value)表示将value转成一个对象
  • new Object(value)表示生成一个对象,它的值是value

部署在Object对象自身的方法

Object.keys()

用来遍历对象的属性

Object.keys方法的参数是一个对象,返回一个数组,该数组的成员都是该对象自身的所有属性名,而不是继承的属性名

只返回可枚举的属性

var obj = {
    p1: 123,
    p2: 456,
};
Object.keys(obj) // ["p1", "p2"]

Object.getOwnPropertyNames()

用来遍历对象的属性

接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名

还返回不可枚举的属性名

var obj = {
    p1: 123,
    p2: 456,
};
Object.keys(obj) // ["p1", "p2"]

var a = ["hello", "hi"];
Object.keys(a) // ["0", "1"]
Object.getOwnPropertyNames(a) // ["0", "1", "length"]

可以用上面两个方法提供计算对象属性个数的方法

var obj = {
    p1: 1,
    p2: 2
};
Object.keys(obj).length // 2
Object.getOwnPropertyNames(obj).length // 2

其他方法

  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的实例方法

定义在Object.prototype对象,所有Object的实例对象都继承了这些方法

主要的Object实例对象的方法

  • Object.prototype.valueOf():返回当前对象对应的值
  • Object.prototype.toString():返回当前对象对应的字符串形式
  • Object.prototype.toLocaleString():返回当前对象对应的本地字符串形式
  • Object.prototype.hasOwnProperty():判断某个属性是否为当前对象自身的属性,还是继承自原型对象的属性
  • Object.prototype.isPrototypeOf():判断当前对象是否为另一个对象的原型
  • Object.prototype.propertyIsEnumerable():判断某个属性是否可枚举

pitaojin
326 声望36 粉丝