Object类型

静态属性和方法

Object类型 - 图1

实例化对象

Object类型 - 图2

原型方法

Object类型 - 图3

注释说明

构造函数

构造函数是以函数的形式为对象定义属性和方法。 :::info 类的概念(类似于抽象数据类型)是定义对象的类型和继承,定义对象有哪些属性、方法,其中属性并没有初始化。从这一点看出ES5之前,js没有显示的支持类(因为没有类型定义和继承)。 :::

不要再构造函数上创建方法,因为每次实例化对象就会重复创建逻辑,根本没必要。

原型

每个函数都会自动创建一个prototype属性,这个属性是一个对象,用来存储对象共享的方法。实例对象中的[[ Prototype ]]属性引用自构造函数的prototype属性。 :::info 原型的机制,默认实例对象是不能更改原型上的属性的,而是在实例对象自身加上该属性,覆盖原型上的属性。但是属性如果是引用值,导致任何实例都会修改里面的值。因此不要将属性放到原型上。 :::

  1. //原型是实例所公有的,所以不应该通过实例能够修改里面的属性和方法。但是属性值如果是引用类型,实例能然能够修改其值。
  2. function Foo() {
  3. }
  4. Foo.prototype.a = 1;
  5. Foo.prototype.b = [1, 2]
  6. const foo = new Foo();
  7. foo.a = 2;
  8. foo.b.push(3)
  9. console.log(foo.a); //2
  10. console.log(foo.b); //[1, 2, b]

Object.create( prototype,PropertyDescriptorMap )

创建对象,指定对象的原型。

  1. SubClass.prototype = Object.create(SuperClass.prototype)
  2. Object.create(null) //用于简单替代Map

Object.assign( )

混入。将源对象中的可迭代属性,分配给目标对象,增强目标对象。对于访问器属性,assign方法就是先get读取目标对象的属性,然后将属性写入(赋值)target对象。

  1. const target = {
  2. set foo(v) {
  3. console.log(v);
  4. }
  5. }
  6. Object.assign(target, { get foo(){return 1} });
  7. //读取源对象的访问器属性foo,读取值为1
  8. //给目标对象赋值,target.foo = 1。因为在target对象中foo是访问器属性,执行set。

:::info

  • 赋值对象只进行浅拷贝。
  • 相同的属性会被覆盖。
  • 不会复制源对象中的原型链上的、不可迭代的属性。返回的对象中的属性是可迭代的。 :::

    缺点:源对象中的访问器属性,复制到目标对象会变成数据属性。