Object 认知

380 阅读4分钟

在javaScript中,几乎所有的对象都是Object类型的实例,它们会从Object.prototype继承属性和方法。Object构造函数为给定值创建一个对象包装器。

  • 如果给定值是null或undefined,将会创建并返回一个空对象。
  • 如果传进去的是一个基本类型的值,则会构造其包装北向的对象。
  • 如果传进去的是引用类型的值,仍然会返回这个值,经他们复制的变量保有和源对象相同的引用地址。
new Object(null)   // {}
new Object(undefined) // {}
new Object('a')   // String {"a"}
new Object(2)   // Number {2}
new Object([])   // []
new Object(() => {})   // () => {}

Object构造函数的属性

  • Object.length 值为1
  • Object.prototype 可以为所有Object类型的对象添加属性

静态方法

  • Object.assign(target, ...sources) 方法用于将所有可枚举属性的值从一个或多个源对象分配到目标对象。它将返回目标对象。该方法是浅拷贝。且不能拷贝继承属性和不可枚举的属性。
  • Object.create(proto, propertiesObject) 参数proto为传入的对象,必需。参数propertiesObject 可选,必须是对象,将为新创建的对象添加指定的属性值和对应的属性描述符。如果传入的是null活着非原始的包装对象会抛出异常。该方法创建一个新对象,使用传入的对象 作为 新创建的对象的原型对象。
Object.create(null) // {}
Object.create(null, {foo: {value: 1, writable:true,
    configurable:true,}}) // {foo: 1}
  • Object.defineProperty() 该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
const object1 = {};

Object.defineProperty(object1, 'property1', {
  value: 42,
  writable: false
});

object1.property1 = 77;
// throws an error in strict mode

console.log(object1.property1);
  • Object.entries() 该方法返回一个给定对象自身可枚举属性的键值对数组,其排列与使用 for...in 循环遍历该对象时返回的顺序一致(区别在于 for-in 循环还会枚举原型链中的属性)。
const obj = { foo: 'bar', baz: 42 };
console.log(Object.entries(obj)); // [ ['foo', 'bar'], ['baz', 42] ]

const obj = ['a', 'b'];
console.log(Object.entries(obj)); // [["0", "a"], ["1", "b"]]

// 将对象转为Map结构
var obj = { foo: "bar", baz: 42 };
var map = new Map(Object.entries(obj));
  • Object.freeze(obj) 该方法可以冻结一个对象。冻结后该对象的属性不能增删改,该对象的原型对象也不可以修改。且冻结是浅冻结
// 深冻结函数.
function deepFreeze(obj) {

  // 取回定义在obj上的属性名
  var propNames = Object.getOwnPropertyNames(obj);

  // 在冻结自身之前冻结属性
  propNames.forEach(function(name) {
    var prop = obj[name];

    // 如果prop是个对象,冻结它
    if (typeof prop == 'object' && prop !== null)
      deepFreeze(prop);
  });

  // 冻结自身(no-op if already frozen)
  return Object.freeze(obj);
}

obj2 = {
  internal: {}
};

deepFreeze(obj2);
obj2.internal.a = 'anotherValue';
obj2.internal.a; // undefined
  • Object.getOwnPropertyNames() 该方法返回一个由指定对象的所有自身属性的属性名(包括不可枚举属性但不包括Symbol值作为名称的属性)组成的数组。
  • Object.keys() 该方法会返回一个由给定对象的自身可枚举属性组成的数组,数组中属性名的排列顺序和正常循环遍历该对象时返回的顺序一致 。
  • Object.values() 该方法返回一个给定对象自身的所有可枚举属性值的数组,值的顺序与使用for...in循环的顺序相同 ( 区别在于 for-in 循环枚举原型链中的属性 )。

Object.prototype的属性和方法

  • Object.prototype.constructor 返回创建实例对象的 Object 构造函数的引用。注意,此属性的值是对函数本身的引用,而不是一个包含函数名称的字符串
  • Object.prototype.__ proto __ 所有的对象都自带了一个__ proto__属性,指向它的原型对象。
  • Object.prototype.hasOwnProperty() 该方法会返回一个布尔值,表示对象自身属性中是否具有指定的属性。
  • Object.prototype.isPrototypeOf() 该方法用于测试一个对象是否存在于另一个对象的原型链上。 prototypeObj.isPrototypeOf(object) 表示prototypeObj是否在objet的原型链上。 在表达式 "object instanceof AFunction"中,object 的原型链是针对 AFunction.prototype 进行检查的,而不是针对 AFunction 本身
  • Object.prototype.toString() 方法返回一个表示该对象的字符串。 每个对象都有一个 toString() 方法,当该对象被表示为一个文本值时,或者一个对象以预期的字符串方式引用时自动调用。默认情况下,toString() 方法被每个 Object 对象继承。如果此方法在自定义对象中未被覆盖,toString() 返回 "[object type]",其中 type 是对象的类型。 Object.prototype.toString.call('a') // 踊跃精确的判断数据类型
  • Object.prototype.valueOf() 方法返回指定对象的原始值。如果对象没有原始值,则valueOf将返回对象本身。
对象返回值
Array返回数组对象本身
Boolean布尔值
Date时间戳
Function函数本身
Number数字值
Object默认返回对象本身
String字符串值