构造函数及class理解

通过构造函数创建对象,定义在构造函数内的方法,经过new运算符,改变this的指向到新创建的实例上,因此定义得属性及方法,相当于动态创建到实例本身上;

函数默认有prototype属性,即默认的原型属性

new运算符 创建个用户定义的对象类型的实例或具有构造函数内部对象的实例

1.创建个空对象

2.设置该对象的construtor到定义的对象 或构造函数

3.将步骤1新创建的对象作为this的上下文

4.若无返回对象则返回this,若返回的是非对象(null ,数值 。。。) 也返回this

当代码 new Foo(...) 执行时,会发生以下事情:

  1. 一个继承自 Foo.prototype 的新对象被创建。
  2. 使用指定的参数调用构造函数 Foo,并将 this 绑定到新创建的对象。new Foo 等同于 new Foo(),也就是没有指定参数列表,Foo 不带任何参数调用的情况。
  3. 由构造函数返回的对象就是 new 表达式的结果。如果构造函数没有显式返回一个对象,则使用步骤1创建的对象。(一般情况下,构造函数不返回值,但是用户可以选择主动返回对象,来覆盖正常的对象创建步骤)

this关键字总是指向函数所在的当前对象,ES6 又新增了另一个类似的关键字super,指向当前对象的原型对象。

super关键字表示原型对象时,只能用在对象的方法之中,用在其他地方都会报错。(因为对象总是继承自其他对象,所以在对象的方法中可以用super做对象使用,指向原型对象)

const proto = {
  foo: 'hello'
};

const obj = {
  foo: 'world',
  find() {
    return super.foo;
  }
};

Object.setPrototypeOf(obj, proto);
obj.find() // "hello"

// 报错
const obj = {
  foo: super.foo
}

// 报错
const obj = {
  foo: () => super.foo
}

// 报错
const obj = {
  foo: function () {
    return super.foo
  }
}

/*上面三种super的用法都会报错,因为对于 JavaScript 引擎来说,这里的super都没有用在对象的方法之中。第一种写法是super用在属性里面,第二种和第三种写法是super用在一个函数里面,然后赋值给foo属性。目前,只有对象方法的简写法可以让 JavaScript 引擎确认,定义的是对象的方法。
*/

http://www.ecma-international.org/ecma-262/#sec-promise.prototype.then

class 定义类

class point{}

typeof point  //function

point.prototype.constructor //point

注:

1.实例的construtor属性继承自类的原型 均为point

2.类的内部所有定义的方法,都是不可枚举的 Object.keys() 获取不到,es5在原型上定义方法可以枚举

 3.constructor默认返回this,若返回个新对象(若return 原始值,则返回this),导致new的实例对象不是类的实例

4.类必须使用new 调用,不可以作为函数使用,会报错

5.存取值函数,对属性进行拦截,该属性属于原型上的属性,不可枚举,

6.类和模块内都是严格模式,不存在变量提升

7.name属性总是返回紧跟在class关键字后面的类名。(使用表达式定义时,函数内部可以使用紧跟class后的名字,外部不可用)

8.静态方法 静态属性 类本身的方法和属性,继承时,静态方法内的super指向父类(不是父类原型)

9.new是从构造函数生成实例的命令,es6引入new.target 属性,返回new作用的构造函数,如果构造函数不是通过new命令调用的,那么new.target会返回undefined,子类继承父类时,new.target 会返回子类

关于继承注意事项

10.子类中若显示写constructor 则必须调用super(),(若不写,则是默认调用),因为子类中没有自己的this对象,而是继承自父类的this对象,对其加工

es5的继承,实质是先创建子类的实例对象,然后再将父类的方法添加到this上;es6的继承完全不同,实质是先创建父类的实例对象,然后在用子类的构造函数去修改this

11.

super作为函数调用时,代表父类的构造函数,只能在子类的构造函数constructor中使用,其余会报错

super作为对象在普通方法中使用,指父类的原型对象,在静态方法中使用指向父类

通过super调用父类的方法是,super会绑定子类的this

赋值时会绑定this后赋值,取值时,super是父类的原型

super作为对象在静态方法中调用,super将指向父类,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值