# Object

每个对象都会有这三个方法

var obj = {}

obj.constructor // 查看构造函数

obj.toString() // 返回一个表示该对象的字符串

obj.valueOf() // 返回值为该对象的原始值

# obj.hasOwnProperty(prop)

判断一个对象是否具有属性prop且非原型属性, 返回Boolean值

var obj1 = {a: 1}
obj1.hasOwnProperty('a') // ture
obj1.hasOwnProperty('toString') // false
obj1.hasOwnProperty('hasOwnProperty');   // 返回 false

# object.isPrototypeOf(obj)

判断该对象obj是否存在于另一个对象object的原型链上,object是obj的原型。返回Boolean值

var obj = {}
function Bar() {}
Bar.prototype = obj
var bar = new Bar()
obj.isPrototypeOf(bar) // true  bar继承自obj
Object.prototype.isPrototypeOf(obj) // ture

# obj.propertyIsEnumerable(prop)

判断prop属性是否可枚举,返回Boolean值

var obj = {a: 1}
obj.propertyIsEnumerable('a') // ture
obj.propertyIsEnumerable('length') // false

# Object.is()

方法判断两个值是否为同一个值,与严格比较运算符(===)的行为基本一致。

Object.is('foo', 'foo') // true

# Object.assign(target, ...sources)

方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。返回目标对象。

属于浅拷贝,同名属性被替换

var target = {a: 1, b: 2}
var source = {b: 3, c: 4}
var resultTarget = Object.assign(target, source)
console.log(resultTarget) // {a: 1, b: 3, c: 4}

# Object.create(proto)

创建一个空对象,将这个对象的__proto__属性指向proto对象,proto为null,新对象是空对象,没有原型,不继承任何对象

就是给他的构造函数指定一个原型对象, 新对象能继承proto的属性 , 和 Object.setPrototypeOf 一样。

var proto = {a: 1}
var obj = Object.create(proto)
console.log(obj) // {}
console.log(obj.__proto__) // {a: 1}

# Object.defineProperty(obj, prop, descriptor)

在obj对象上定义一个新属性,或者修改现有属性,并返回此对象。

// descriptor:对这个prop属性进行描述
// descriptor: {
//   configurable: 当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为 false
//   enumerable : 当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。 默认为 false
//   value : 该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。 默认为 undefined
//   writable : 当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值改变。 默认为 false。
//   get: 属性的 getter 函数
//   set: 属性的 setter 函数
// }
var obj = {}; // 创建一个新对象
// 在对象中添加一个属性与数据描述符的示例
Object.defineProperty(obj, "a", {
  value : 37,
  writable : true,
  enumerable : true,
  configurable : true
});
console.log(obj) // {a: 37}

// 修改obj的属性
Object.defineProperty(obj, "a", {
  value: 38
})
console.log(obj) // {a: 38}

##Object.keys(obj)

返回obj键名数组

# Object.values(obj)

返回obj键值数组

# Object.entries(obj)

返回obj键值对数组

var obj = { foo: 'bar', age: 42 };

Object.keys(obj) // ["foo", "age"]

Object.values(obj) // ["bar", 42]

Object.entries(obj) // [ ["foo", "bar"], ["age", 42] 

# Object.fromEntries()

是Object.entries()的逆操作,用于将一个键值对数组转为对象

Object.fromEntries([
  ['foo', 'bar'],
  ['baz', 42]
])
// { foo: "bar", baz: 42 }

# Object.getPrototypeOf(obj)

获取对象obj的原型

var proto = {};
var obj = Object.create(proto);
Object.getPrototypeOf(obj) === proto; // true

# Object.setPrototypeOf(obj, prototype)

设置对象obj的原型为prototype

var obj = {a: 1}
var proto = {b: 2}
Object.setPrototypeOf({}, null)  // {}
Object.setPrototypeOf(obj, proto)  // {a: 1}
console.log(obj.__proto__) // {b: 2}
console.log(obj.__proto__ === proto) // true

# Object.freeze()

冻结一个对象, 所有属性都不可能以任何方式被修改

# Object.isFrozen()

判断一个对象是否被冻结。

# Object.seal()

封闭一个对象, 只可修改当前对象,不能添加和删除。

# Object.isSealed()

判断一个对象是否被密封。