亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

有一個情景,求解

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??墒莿h除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深入淺出
  • 參與學習       281094    人
  • 解答問題       1054    個

由淺入深學習JS語言特性,且解析JS常見誤區,從入門到掌握

進入課程

有一個情景,求解

我要回答 關注問題
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號