script>
/* 父类 */
function Person(){
// this.head = 1;
// this.foot = 2;
}
Person.prototype.head = 1;
Person.prototype.foot = 2;
/* 子类 */
function Student(){
this.name ='zhangsan';
this.no = '9587';
}
/*
Student的prototype指向一个Person的实例
*/
/*
Student的prototype属性指向一个Person实例的写法,相当于完全删除了prototype原先的值,赋了一个新值,所以要为新的prototype对象加上constructor属性,并将这个属性指回原来的构造函数
*/
/* new出来的是一个实例化对象 覆盖 到构造函数Student的原型上 */
// Student.prototype = new Person();
// /* constructor 构造器 */
// Student.prototype.constructor = Student;
// let stu1 = new Student();
// console.log(stu1);
// /* 实例化出来的对象 本身是没有foot属性,通过原型链找到了原型里面的属性foot */
// document.write(stu1.foot);
/* 构造函数 */
// function A(){
// /* 构造函数内部的属性 */
// this.car = '奔驰'
// }
// /* 通过new 实例化出了一个对象a */
// let a = new A()
// console.log(a);
/* 直接继承prototype */
/* 由于Person对象中,不变的属性都可以直接写入Person.prototype。 */
// console.log( Person.prototype);
Student.prototype = Person.prototype;
Student.prototype.constructor = Student;
let stu1 = new Student();
// console.log(stu1);
/* 继承之后通过原型链找到Student的原型下面的head属性 */
// document.write(stu1.head);
/* 按道理来说,子类是不能改变父类 */
Student.prototype.car = '本田';
console.log(Person.prototype)
/*
优点:效率比较高(不用执行和建立Person的实例了)
缺点:Student.prototype和Person.prototype现在指向了同一个对象,任何对Student.prototype的修 改,都会反映到Person.prototype
*/
</script>