【JS OOP中的继承】
1、继承:使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承
>>>继承的两方,发生在两个类之间
2、扩展Object实现继承
①、声明父类
function Person(){ }
声明子类
function Son(){ }
②、通过prototype给Object类添加一个扩展方法;
Object.prototype.extend = function(parent){ for(var i in parent){ this[i] = parent[i]; } }
③、分别拿到父类对象和子类对象
var p = new Person(); var s = new Student();
④、用子类对象,调用扩展方法,实现继承操作
s.extend(p);
3、实现继承的原理
通过循环,将父类对象的所有属性和方法,全部赋给子类对象,关键点在于for-in循环,即使不扩散Object,也能通过简单的循环实现操作
4、扩展Object继承的缺点
①、无法通过一次实例化,直接拿到完整的子类对象,而需要先拿到父类对象和子类对象两个对象,在手动合并。
②、扩展Object的继承方法,也会保留在子类的对象上。
【JS OOP中的继承】
1、继承:使用一个子类继承另一个父类,那么子类可以自动拥有父类中的所有属性和方法,这个过程叫做继承
>>>继承的两方,发生在两个类之间
2、使用原型实现继承
①、定义父类
function Parent(){ }
定义子类
function Son(){ }
②、将父类对象,赋值给子类的prototype
Son.prototype = new Person();
③、拿到子类对象时,就会将父类对象的所有的属性和方法,添加到__proto__
var s = new Son();
3、使用原型继承的原理
将父类对象,赋值给子类的prototype,那么父类对象的属性和方法就会出现在子类的prototype中。那么,实例化子类时,
子类的prototype又会到子类对象的__proto__中,最终,父类对象的属性和方法,会出现在子类对象的__proto__中
4、这种继承的特点
①、子类自身的所有属性都是成员属性,父类继承过来的属性都是原型属性
②、依然无法通过一步实例化拿到完成的子类对象
【call/bind/apply】
1、三个函数的作用:通过函数名调用这三个函数,可以强行将函数中的this指定为某个对象
2、三个函数的写法(区别):
call写法:func.call(func的this指向的obj,func参数1,func参数2,……);
apply写法:func.apply(func的this指向的obj,[func参数1,func参数2,……]);
bind写法:func.bind(func的this指向的obj)(func参数1,func参数2,……);
3、三个函数的唯一区别:在于接受func的参数列表的方式不同,除此之外,没有任何不同。
【使用call/bind/apply实现继承】
1、实现步骤
①、定义父类
function Person(name){ }
②、定义子类时,在子类中使用三个函数,调用父类,将父类函数的this,指向为子类函数的this
function Student (no) { this.no = no; Person.call(this,name,age); }
③、实例化子类时,将自动继承父类属性
var s = new Son(12,"张三");