继承
ES6可以使用extends实现继承,ES6之前并没有提供extends继承,我们可以通过构造函数+原型对象模拟实现继承,被称为组合继承
call()方法
调用这个函数,并且修改函数运行时的this指向
fun.call (thisArg , arg1 ,arg2, .....)
参数:
thisArg :当前调用函数的this指向对象
arg1 ,arg2:传递的其他参数
//call方法
function fn(x,y) {
console.log("继承");
console.log(this); //指向window
}
var o = {
name: 'andy'
}
// fn(); 以前的调用方式
//1.call() 可以调用函数
fn.call(); //输出 继承
//2.call()可以改变这个函数的this指向
fn.call(o,1,2);//指向的是对象o 1传递给x,2传递给y,o不参与传递,只是为了改变指向
借用构造函数继承父类型属性
核心原理:通过call()把父类型的 this 指向子类型的this,这样就可以实现子类型继承父类型的属性
// 借用构造函数继承父类型属性
//1.父构造函数
function Father(uname, age) {
//this指向父构造函数的对象实例
this.uname = uname;
this.age = age;
}
//2.子构造函数
function Son(uname, age, score) {
//this指向子构造函数的对象实例
Father.call(this, uname, age);
//首先调用了父构造函数,然后把父构造函数里面的this指向改为指向子构造函数
//还可添加子构造函数自己的属性
this.score = score;
}
var ldh = new Son("刘德华", 18, 100);
console.log(ldh);
借用构造函数继承父类型方法
不能直接把父构造函数方法直接赋值给子构造函数,因为这样做的话,子构造函数的方法是指向父构造函数方法的地址,此时如果给子构造函数增加它的方法,会连带着父构造函数的方法一起更改。
即Son.prototype = Father.prototype
这样直接赋值是错误的
应该用:Son.prototype = new Father();
PS:如果利用对象的形式修改了原型对象,别忘了利用constructor指会原来的构造函数
// 借用构造函数继承父类型属性
//1.父构造函数
function Father(uname, age) {
//this指向父构造函数的对象实例
this.uname = uname;
this.age = age;
}
Father.prototype.money = function() {
console.log(10000);
}
//2.子构造函数
function Son(uname, age, score) {
//this指向子构造函数的对象实例
Father.call(this, uname, age);
//首先调用了父构造函数,然后把父构造函数里面的this指向改为指向子构造函数
//还可添加子构造函数自己的属性
this.score = score;
}
//Son.prototype = Father.prototype; 这样直接赋值是错误的
//应该用下面这种方法
Son.prototype = new Father();
//如果利用对象的形式修改了原型对象,别忘了利用constructor指会原来的构造函数
Son.prototype.constructor = Son;
Son.prototype.exam = function() {
console.log("考试");
}
var son = new Son("刘德华", 18, 100);
console.log(son);