通过构造函数创建对象,定义在构造函数内的方法,经过new运算符,改变this的指向到新创建的实例上,因此定义得属性及方法,相当于动态创建到实例本身上;
函数默认有prototype属性,即默认的原型属性
new运算符 创建个用户定义的对象类型的实例或具有构造函数内部对象的实例
1.创建个空对象
2.设置该对象的construtor到定义的对象 或构造函数
3.将步骤1新创建的对象作为this的上下文
4.若无返回对象则返回this,若返回的是非对象(null ,数值 。。。) 也返回this
当代码 new Foo(...)
执行时,会发生以下事情:
- 一个继承自
Foo.prototype
的新对象被创建。 - 使用指定的参数调用构造函数
Foo
,并将this
绑定到新创建的对象。new Foo
等同于new Foo
()
,也就是没有指定参数列表,Foo
不带任何参数调用的情况。 - 由构造函数返回的对象就是
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将指向父类,