1.函数对象的相关属性和方法
prototype:原型对象,它是函数的一个属性(通过这个函数指向构造方法)
作用:存储着该类的实例对象共有的方法或者属性
_proto_:所有实力对象拥有的属性,作用为找到该类的原型对象,从而实现可以使用原型对象的方法或者属性
原型对象的属性是不可以通过实力对象修改的
如果实力对象修改了原型对象的属性,效果等价于添加了一个同名的自定义属性
2.apply、call也是改变函数的this指向
作用为解耦
function Snake(name){
this.name = name;
}
function Monkey(name){
this.name = name;
}
function eat(food1,food2){
console.log(this.name + "eat:" + food1,food2);
}
let s = new Snake("小青");
let m = new Monkey("熏悟空");
//eat.call(this指向,eat的实际参数);
eat.call(s,"青蛙","老鼠");
eat.call(m,"桃子","香蕉");
eat.apply(s,["青蛙","老鼠"]);
eat.apply(m,["桃子","香蕉"]);
eat.bind(s,"1","2")();
apply、call、bind的区别
1.全部改变this指向
2.apply、call针对匿名函数,bind针对匿名函数
3.apply、call直接调用函数 / bind等价绑定函数,还需要将绑定的结果进行调用
4.apply的参数需要用[ ]括起来,call不需要
原型继承:
规则:将子类的原型指向父类的实例化对象
作用:可以通过子类的对象,直接访问父类的属性和方法
typeof和instanceof区别
typeof 是一个操作符,主要的目的是检测一个变量是不是基本数据类型的变量,同时也可以说是确定一个变量是字符串,数值,布尔值,还是undefined的最佳工具
typeof返回的类型有六种:“number”,“string”,“boolean”,“object”,以及“function”和“undefined”
instanceof主要目的是检测引用类型,判断对象是Array,还是RegExp!
typeof和instanceof的目的都是检测变量的类型,两个的区别在于typeof一般是检测的基本数据类型,instanceof主要检测的是引用类型
原型链继承的注意事项
1.必须先实现继承关系,再为子类添加原型方法或者属性,否则会被覆盖
2.所有由父类派生给子类的属性都是无法初始化的
3.一旦继承关系实现后,子类的原型对象不能发生改变
ES6继承
extends实现继承的关键字
super借用父类的构造方法 注意:super必须放在子类构造方法的第一行
class Human{
constructor(name,id) {
this.name = name;
this.id = id;
}
eat(){
console.log("Human eat");
}
}
//extends实现继承的关键字
class Student extends Human{
constructor(name,id,score) {
//super借用父类的构造方法
//注意:super必须放在子类构造方法的第一行
super(name,id);
this.score = score;
}
study(){
console.log("Student study");
}
}
let s = new Student("凢凢",2,100);
console.log(s.id,s.name,s.score);
s.eat();
s.study();