ES5类的继承
属性继承
父类.方法.call(this,参数1,参数2,......) 父类.方法.apply(this,[参数1,参数2,.....])
//父类
function Person(name, color, weight, hight) {
this.name = name;
this.color = color;
this.weight = weight;
this.hight = hight;
Person.prototype.sleep = function () {
return '正在睡觉'
}
Person.prototype.eat = function () {
return '正在吃饭'
}
}
//子类
function Student(name, color, weight, hight, sno, grade) {
//this借用
//被借用的对象.方法.call(需要借的对象,参数1,参数2,.....)
/* Person构造函数全局定义的,有个最顶级的对象Window,所以这儿被借用的对象是Window,
在Student构造函数中this指向的是实例对象,也就是需要修改的对象,所以这里需要借的对象是this 后面就跟对应的属性 */
/* window.Person.call(this, name, color, weight, hight) Window可以不写
所以属性继承是:
父类.方法.call(this,参数1,参数2,......)
父类.方法.apply(this,[参数1,参数2,.....]) */
Person.call(this, name, color, weight, hight)
this.sno = sno;
this.grade = grade;
}
let p1 = new Person('小天', '黄皮肤', 60, 170)
console.log(p1);
let s1 = new Student('小天', '黄皮肤', 60, 170, 123456, '大三')
console.log(s1);
原型继承
原型链继承
子类.prototype.__proto__ = 父类.prototype

Student构造函数实例化的对象s1通过
__proto__去它的显式原型里面找eat方法,没找到,然后通过原型链:逐级向上,就近原则,在它的prototype里通过__proto__去找到Object的显式原型里,还是没有,如果在Object的prototype里在通过__proto__去找,就是null了 所以直接s1.eat()0会报eat is not a function的错
问题就出在最长的那根红线,所以想找到
eat方法,就应该如图更改指向即:Student.prototype.
__proto__= Person.prototype
//父类
function Person(name, color, weight, hight) {
this.name = name;
this.color = color;
this.weight = weight;
this.hight = hight;
Person.prototype.sleep = function () {
return '正在睡觉';
}
Person.prototype.eat = function () {
return '正在吃饭';
}
}
//子类
function Student(name, color, weight, hight, sno, grade) {
//this借用
//被借用的对象.方法.call(需要借的对象,参数1,参数2,.....)
/* Person构造函数全局定义的,有个最顶级的对象Window,所以这儿被借用的对象是Window,
在Student构造函数中this指向的是实例对象,也就是需要修改的对象,所以这里需要借的对象是this 后面就跟对应的属性 */
/* window.Person.call(this, name, color, weight, hight) Window可以不写
所以属性继承是:
父类.方法.call(this,参数1,参数2,......)
父类.方法.apply(this,[参数1,参数2,.....]) */
Person.call(this, name, color, weight, hight)
this.sno = sno;
this.grade = grade;
Student.prototype.study = function () {
return '正在学习'
}
//继承原型空间
Student.prototype.__proto__ = Person.prototype
}
let p1 = new Person('小天', '黄皮肤', 60, 170)
console.log(p1);
let s1 = new Student('小天', '黄皮肤', 60, 170, '123456', '大三')
console.log(s1);
console.log(s1.sleep());
console.log(s1.eat());
4768

被折叠的 条评论
为什么被折叠?



