为了账号安全,请及时绑定邮箱和手机立即绑定

有一个情景,求解

student.prototype.hi覆盖了继承的person.prototype.hi,若我想通过student调用person.protype.hi时,应该怎么做。

相当于学生在学校自我介绍需要用student.prototype.hi,出来社会后需要person.prototype.hi,但不可以删除任意一个。我想知道可以通过什么参数来获得

正在回答

2 回答

好详细+1

0 回复 有任何疑惑可以回复我~

我好像不太理解。不过抛砖引玉,如果有哪里不对,请@ 我一声,感谢!!

首先,逻辑上,如果你需要覆盖一个方法,为什么还要调用它?

对于「学生在学校自我介绍需要用student.prototype.hi,出来社会后需要person.prototype.hi」,这应该是【学生在不同的场合说不同的话】,也就是说这个场景的都是在谈论【学生】的,跟【人】这个类没有关系。也许学生默认情况下说的 hi 就是人说的 hi,但那也是学生这个类说的。

demo1:直接写出默认值

function Person(name,age){
	this.name = name;
	this.age = age;
}
Person.prototype.hi = function(){
	console.log("Hi,my name is "+this.name+", I'm "+this.age+" years old now.");
}

function Student(name,age,className){
	Person.call(this,name,age);
	this.className = className;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
		
Student.prototype.hi = function(where){
	if(where === "school"){
		console.log("Hi,my name is "+this.name+", I'm "+this.age+" years old now, and I'm from "+this.className+".");
	}else{
		console.log("Hi,my name is "+this.name+", I'm "+this.age+" years old now.");
	}
}

var bson = new Student("Bson",27,"Class 3,Grade 2");
bson.hi();
bson.hi("school");

demo2:使用Person 类的 .hi() 作为默认值

function Person(name,age){
	this.name = name;
	this.age = age;
}
Person.prototype.hi = function(){
	console.log("Hi,my name is "+this.name+", I'm "+this.age+" years old now.");
}

function Student(name,age,className){
	Person.call(this,name,age);
	this.className = className;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

Student.prototype.super = Person.prototype;

Student.prototype.hi = function(where){
	if(where === "school"){
	    this.super.hi.call(this);
	    console.log("I'm from "+this.className+".");
	}else{
	    this.super.hi.call(this);
	}
}

var bson = new Student("Bson",27,"Class 3,Grade 2");
bson.hi();
bson.hi("school");

而对于 【被子类覆盖的 .hi() 方法】,能否通过什么参数获得?

就我认知是不可以的。

当对象调用函数时,JS 会在该对象的原型链上去寻找,找到 即 返回,而 不会 再向原型链的 上一级 去寻找。

3 回复 有任何疑惑可以回复我~
#1

arlenhui 提问者

student.prototype.hi覆盖了person原有的原型链上的hi。可是删除student原型链上的hi就可以调用父类person原型链上的hi对吧。意思是虽然student.prototype.hi覆盖了,但应该存在一种非删除方法可以从student这个对象上再次调用父类person的hi。那我任性一点,我覆盖了我还是要调用父类,请问可以的吗?不可以的话我就明白了
2015-05-19 回复 有任何疑惑可以回复我~
#2

arlenhui 提问者

我明白了,因为之前我是通过__proto__获取过被覆盖的父类属性,但由于proto是内部属性,不推荐使用,各个浏览器的内部属性名称是有区别的;如果一个对象的属性和原型上的属性重名,那就相当于覆盖;如果要取原型对象上的属性,可以通过constructor获取。以此类推,我以为函数也可以这样调用。
2015-05-19 回复 有任何疑惑可以回复我~
#3

定定

Student.prototype.super = Person.prototype;请问这句话的作用详细点来说是干什么用的?
2015-06-10 回复 有任何疑惑可以回复我~
#4

Issa_Tan 回复 定定

刚换工作比较忙,所以没上慕课比较久了,这么晚回复,Sorry。Student.prototype.super = Person.prototype; 这句话我是为了在 Student.prototype 上挂一个 super 属性,指向 Person.prototype, 自然这个属性是必须 freeze() 的。主要的目的是为了在 Student.prototype.hi 的构造里重用 Person.prototype.hi
2015-06-14 回复 有任何疑惑可以回复我~
#5

定定 回复 Issa_Tan

非常感谢,所以这个super就有点像java里面的super了~~
2015-06-16 回复 有任何疑惑可以回复我~
查看2条回复

举报

0/150
提交
取消
JavaScript深入浅出
  • 参与学习       281102    人
  • 解答问题       1020    个

由浅入深学习JS语言特性,且解析JS常见误区,从入门到掌握

进入课程

有一个情景,求解

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信