@windchimes
2022-03-01T10:34:14.000000Z
字数 1906
阅读 192
快手学习备考
function classA(color) {this.color = color;this.sayColor = function() {console.log(this.color);}}function classB() {this.newMethod = classA;this.newMethod();delete this.newMethod;}// call实现function classB() {classA.call(this, color1, color2);}// apply实现function classB() {classA.call(this, arguments);}
function classA() {}classA.prototype.color = 'red';classA.prototype.sayColor = function() {console.log(this.color);}function classB() {}classB.prototype = new ClassA();
function classA() {this.color = 'red';}classA.prototype.sayColor = function() {console.log(this.color);}function classB() {classA.call(this, color);}classB.prototype = new classA();classB.prototype.constructor = classB;
function classA() {this.color = 'red';}classA.prototype.sayColor = function() {console.log(this.color);}function classB() {classA.call(this);}classB.prototype = Object.create(classA.prototype);classB.prototype.constructor = classB;
注释:
1. 创建类的最好方式是用构造函数定义属性,用原型定义方法
2. call apply
是为对象冒充而实现的方法,apply第二个参数是参数数组
3. new 实现了什么
创建一个空对象
将空对象的原型指向构造函数的原型
修改this指向
判断返回值(是对象时,调用return new无效,否则返回obj)
```
function new(con, arguments) {
let obj = {};
obj.setPrototypeOf(obj, con.prototype);
let res = con.apply(obj, arguments);
return res instanceof Ojbect ? res : obj;
}
```
4. es6的class源码实现
es5的继承是子类拥有自身的实例对象this,通过call或apply将父类的属性或方法挂载在上面,es6的继承机制则不同,先将父类的属性和方法放在this上面,然后再调用子类的构造函数修改this;
5. object.create()
```
function create(obj) {
function F() {}
F.prototype = obj;
return new F();
}
```
跟普通创建对象方式相比:
创建方式不同(继承) 创建对象属性的性质不同(object.defineProperty) 创建空对象时不同(无原型属性,即无__proto__)
6. 混合继承 object.assign
3参考链接:https://zhuanlan.zhihu.com/p/158640941
5参考链接:https://www.jianshu.com/p/28d85bebe599
6参考链接:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/create
参考链接:https://www.w3school.com.cn/js/pro_js_inheritance_implementing.asp
https://zhuanlan.zhihu.com/p/110175302