ES6中Object的用法

Object.getOwnPropertyDescriptor

一般的我们通过name属性可以获取函数名,像下面

let demo1 ={
    say(){
        console.log("im say")
    }
}
console.log("第一个例子",demo1.say.name)

如果对象的方法使用了取值函数(getter)和存值函数(setter)
直接获取name获取不到

let demo2 = {
    get foo(){},
    set foo(x){}

};
obj.foo.name

会发现出现错误:Uncaught TypeError: Cannot read property 'name' of undefined

这时候就要使用Object的这个属获取了

let description = Object.getOwnPropertyDescriptor(demo2,'foo');
console.log(description.get.name)
console.log(description.set.name)

输出

get foo
set foo

Object.create

Object.create()方法用于创建一个新对象,并把新对象的原型对象指向该方法的第一个参数。
语法
Object.create(prototype, [propertiesObject])
参数

  • prototype:新创建的对象的原型对象。这个参数只能是一个对象或者是null。传入其他值会抛出TypeError。

  • propertiesObject:可选。要添加到新对象内的属性。

返回值

一个新创建的对象,带着指定的原型对象和属性。

var obj1 = { a: 1 };
var obj2 = Object.create(obj1);
obj2.__proto__ === obj1; // true
obj2.__proto__.__proto__ === Object.prototype; // true
obj2.a === 1; // true,调用的是原型对象obj1的自有属性a

Object.getPrototypeOf

Object.getPrototypeOf() 方法用于获取指定对象的原型对象(也就是__protp__的指向)
语法:Object.getPrototypeOf( obj )
参数:obj ---> 你所指定的对象

function Obj() {
    this.name = 'liming';
}
var obj = new Obj();
console.log(Object.getPrototypeOf(obj) === obj.__proto__ ); // true  说明地址一致

使用符合标准的Object.getPrototypeOf函数而不要使用非标准的__proto__属性
另外可以使用这个方法判断,一个类是否继承了另一个类。

Object.assign

语法
Object.assign(target, ...sources)
target 目标对象。sources源对象。
Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
它属于浅拷贝之拷贝了引用

const target = { a: 1 };

const source1 = { b: 2 };
const source2 = { c: 3 };

Object.assign(target, source1, source2);
target // {a:1, b:2, c:3}

Object.assign方法的第一个参数是目标对象,后面的参数都是源对象。如果键名存在则更新。
因为采用这种方法克隆,只能克隆原始对象自身的值,不能克隆它继承的值。如果想要保持继承链,可以采用下面的代码

// 深拷贝

function clone(origin) {
  let originProto = Object.getPrototypeOf(origin);
  return Object.assign(Object.create(originProto), origin);
}

我们可以使用它为对象添加方法

 function Person(name, age) {
    this.name = name;
    this.age = age;
}
Object.assign(Person.prototype, {
  someMethod(arg1, arg2) {
    console.log("in someMethod")
  },
  anotherMethod() {
    console.log("in anotherMethod")
  }
});
let person =new Person("lisa")
person.anotherMethod()
// 等同于下面的写法
Person.prototype.someMethod = function (arg1, arg2) {
  ···
};
Person.prototype.anotherMethod = function () {
  ···
};

Object.keys

遍历对象的键

var d = {"a":1,"b":2,"c":3}

for (let k of Object.keys(d)){

console.log(k)

}

Object.value

遍历对象的值

for (let k of Object.values(d)){

console.log(k)

}

Object.entries

这主要是遍历对象键值对

for (let [k,v] of Object.entries(d)){

console.log(k,v)

}
posted @ 2020-07-09 11:22  公众号python学习开发  阅读(227)  评论(0编辑  收藏  举报