Open Hibop opened 6 years ago
重新理解JS的6种继承方式: http://www.cnblogs.com/ayqy/p/4471638.html
function Fun(){
// 私有属性
var val = 1; // 私有基本属性
var arr = [1]; // 私有引用属性
function fun(){} // 私有函数(引用属性)
// 非原型实例,私有属性
this.val = 1; // 实例私有基本属性
this.arr = [1]; // 实例私有引用属性
this.fun = function(){}; // 实私有例函数(引用属性)
}
// 原型共享属性
Fun.prototype.val = 1; // 原型基本属性
Fun.prototype.arr = [1]; // 原型引用属性
Fun.prototype.fun = function(){}; // 原型函数(引用属性)
1. 创建对象:
new Object()
字面量
工厂模式
构造函数模式: new Object是构造函数的特殊
注意: 箭头函数无法new 创建
原型模式
Person.prototype.name = 'ifyour'; Person.prototype.age = 18; Person.prototype.sayName = function(){ console.log(this.name); }
var person1 = new Person(); var person2 = new Person(); person1.sayName(); // => ifyour console.log(person1.sayName == person2.sayName); // => ture
缺点: 不能向父类传参; 改变一个子类实例会影响到其他
也会有一个问题:子类无法继承父类定义在原型身上的属性和方法。 ,属性和方法都需要在构造函数内部定义。但是这样函数的复用就无从谈起了,并且每个对象实例都会保存相同的方法,这种方式也会造成内存的浪费。考虑到这些问题,借用构造函数的技术也是很少单独使用的。
遍历继承(也叫拷贝继承, 冒充继承): 其实就是遍历父类实例,拿来给子类
组合(混合)继承: 有时候也叫做伪经典继承,指的是将原型链和借用构造函数的 技术组合到一块,从而发挥二者之长的一种继承模式。实现的思路就是:使用原型链实现对原型身上的方法的继承,同时通过借用构造函数来实现对实例属性的继承。
问题: 调用两次父类构造函数
优化型
中间件继承 子类的私有实例: Parent.call(this, ...arguments) 子类的共享实例: Child.prototype = Parent.prototype
7 Es 6 Class-extends继承 区别: es5继承: 实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面(Parent.apply(this))。 不能继承原生对象Array... es6 的继承机制完全不同: 实质是先将父类实例对象的属性和方法,加到this上面(所以必须先调用super方法),然后再用子类的构造函数修改this。 可以继承原生对象Array...
es5每个对象有proto属性, 每个函数有protoype属相 Class 作为构造函数的语法糖,同时有prototype属性和proto属性,因此同时存在两条继承链。 Child.proto === Parent 表示构造函数的继承,总是指向父类构造函数 : child作为对象 child.prototype.proto === Parent.prototype 表示实例方法的继承,指向父类的原型 : child作为构造函数 实现原理