You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
function create(Con, ...args) {
let obj = {};
Object.setPrototypeOf(obj, Con.prototype);
let result = Con.apply(obj, args);
return result instanceof Object ? result : obj;
}
class A {
p() {
return 2;
}
}
class B extends A {
constructor() {
super();
console.log(super.p()); // 2
}
}
let b = new B();
ES6 规定,通过super调用父类的方法时,super会绑定子类的this
class A {
constructor() {
this.x = 1;
}
print() {
console.log(this.x);
}
}
class B extends A {
constructor() {
super();
this.x = 2;
}
m() {
super.print();
}
}
let b = new B();
b.m() // 2
class A {
constructor() {
this.x = 1;
}
}
class B extends A {
constructor() {
super();
this.x = 2;
super.x = 3;
console.log(super.x); // undefined
console.log(this.x); // 3
}
}
let b = new B();
原型和原型链
理解原型设计模式以及JavaScript中的原型规则
原型规则
new
操作符创建实例__proto__
指向构造函数的prototype
指向的原型对象constructor
指向它的构造函数__proto__
属性prototype
属性,函数即可作为构造函数也可作为对象,因此也有__proto__
属性_proto_
属性沿着它的原型链向上寻找设计模式
prototype
属性对属性进行定义,可以让所有对象实例共享它多包含的属性及方法instanceof的底层实现原理,手动实现一个instanceof
实现原理
instanceof
是用来判断一个实例是否属于某个类型或者用来判断是否是其父类型或者祖先类型的实例__prop__
是否和右边构造函数的prototype
指向同一个原型对象来判断,查找过程中会遍历左边变量的原型链,通过o.__proto
一层一层往上找,直到找到与右边变量的prototype
相等,返回true
,否则返回false
。实现
实现继承的几种方式以及他们的优缺点
原型链继承
利用
Sub.prototype = new Super()
,这样连通了子类-子类原型-父类。优点:
缺点:
构造函数继承
在构造子类构造函数时内部使用
call
或apply
来调用父类的构造函数优点:
call
绑定多个父类对象)缺点:
组合继承
使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现对实例属性的继承
优点:
instanceof
和isPrototypeOf( )
也能用于识别基于组合继承创建的对象缺点:
寄生组合继承
寄生组合式继承就是为了降低调用父类构造函数的开销而出现的,不必为了指定子类型的原型而调用超类型的构造函数
优点:
Class继承
缺点:
至少说出一种开源项目(如Node)中应用原型继承的案例
可以描述new一个对象的详细过程,手动实现一个new操作符
过程
prototype
指向的原型对象。new foo
等同于new foo()
只能用在不传递任何参数的情况下。实现
理解es6 class构造以及继承的底层实现原理
构造
class
关键字可以定义类,类的所有方法都是定义在类的prototype
属性上,在类的实例上面调用方法,其实就是调用原型上的方法。constructor
方法。如果没有显示定义,也会有一个空的constructor
方法被默认添加。通过new
命令生成对象实例时,自动调用该方法。this
对象上),否则都是定义在原型上(即定义在class
上)。super
关键字既可以当作函数使用,也可以当作对象使用。super
虽然代表了父类A的构造函数,但是返回的是子类B的实例,即super
内部的this
指的是B,因此super()
在这里相当于A.prototype.constructor.call(this)
super
指向父类的原型对象,所以定义在父类实例上的方法或属性,是无法通过super
调用的super
调用父类的方法时,super
会绑定子类的this
this
,所以如果通过super
对某个属性赋值,这时super
就是this
,赋值的属性会变成子类实例的属性继承的底层实现原理
ES5的继承,实质是先创造子类的实例对象
this
,然后再将父类的方法添加到this
上面(Parent.apply(this)
)。ES6的继承机制完全不同,实质是先创造父类的实例对象this
(所以必须先调用super
方法),然后再用子类的构造函数修改this
。__proto__
属性,表示构造函数的继承,总是指向父类prototype
属性的__proto__
属性,表示方法的继承,总是指向父类的prototype
属性Object.getPrototypeOf
方法可以用来从子类上获取父类,因此,可以使用这个方法判断,一个类是否继承了另一个类。代码实现:
The text was updated successfully, but these errors were encountered: