来判断这个实例(p1)是不是这个构造函数(Person)实例化出来的对象
console.log(p1 instanceof Person); =>true
console.log(p1 instanceof Student); =>false
万物皆对象
构造函数可以理解为一个类
function Person(){
this.head = 1;
this.foot = 2;
}
function Student(name,no){
this.name = name;
this.no = no;
}
让学生类 继承 人类的两个脚和一个头的属性
Student的prototype指向一个Person的实例
Student.prototype = new Person();
加上constructor属性,并将这个属性指回原来的构造函数
Student.prototype.constructor = Student;
let stu1 = new Student();
console.log(stu1);
console.log(stu1.head);
console.log(stu1.foot);
不变的属性都可以直接写入Person.prototype
Student想要继承Person的属性
直接继承prototype
// Student.prototype = Person.prototype;
// let stu1 = new Student();
// console.log(stu1.head);
// console.log(stu1.foot);
// // console.log('stu1',stu1);
缺点: 任何对Student.prototype的修改,都会反映到Person.prototype Student的constructor不会指向自己
空对象,几乎不占内存 修改Student的prototype对象,不会影响到Person的prototype对象
新建一个空对象
function f(){}
把父类的原型直接赋值给空对象的原型
f.prototype = Person.prototype;
把空对象的实例化对象 给到子类的原型上
Student.prototype = new f();
★constructor构造器都是指向自己的
Student.prototype.constructor = Student;
extend(Student, Person)
let stu1 = new Student();
console.log(stu1.foot);
console.log(stu1)
不会影响到Person的prototype对象
Student.prototype.age = 30;
let p = new Person();
console.log(p);
原型链就是一层一层向上找的过程 原型链继承就是利用了上面这种特性