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

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

JS面向對象的new操作

JS面向對象的new操作

HUX布斯 2019-04-13 08:45:26
創建了一個函數Shape,在他的prototype上寫了一個name屬性和toString方法,接著輸出Shape的name屬性和調用toString方法。然后new一個Shape的實例——Triangle,分別輸出Triangle的name屬性和調用toString方法,結果如下:varShape=function(){};Shape.prototype.name='Shape';Shape.prototype.toString=function(){returnthis.name;}console.log(Shape.name);//''console.log(Shape.toString());//function(){}varTriangle=newShape();console.log(Triangle.name);//'Shape'console.log(Triangle.toString());//'Shape'記得new操作完成了兩件事:1.將this指向實例2.將實例的__proto__或者說[[prototype]]指向構造函數的prototype屬性。(有不對和漏的地方請補充?。┻@樣可以理解實例函數去__proto__中查找name屬性和toString()方法。而構造函數似乎直接去爬原型鏈了,為什么它不先在自身的屬性中查找呢?試著給Triangle的prototype加一個同名屬性和方法:Triangle.prototype={};//這里還有一個疑問,new出來的對象//沒有prototype屬性,是因為函數要作為構造函數//所以內置了prototype屬性么?Triangle.prototype.name='Triangle';Triangle.prototype.toString=function(){return'Iam'+this.name;}console.log(Triangle.name);//'Shape'console.log(Triangle.toString());//'Shape'嘛...和構造函數一個德行,求解惑~謝謝!
查看完整描述

2 回答

?
夢里花落0921

TA貢獻1772條經驗 獲得超6個贊

看來題主還不是很理解js是基于原型的編程語言,它可以模仿面向對象,但它從根本上是基于原型的。
如果題主想要模仿繼承應該這么做:
varShape=function(){};
Shape.prototype={
constructor:Shape,
type:'Shape',
toString:function(){
returnthis.type;
}
}
varTriangle=function(){};
Triangle.prototype=newShape();
Triangle.prototype.type='Triangle';
可以試一下結果:
vart=newTriangle();
tinstanceofTriangle//true
tinstanceofShape//true
t.toString()//'Triangle'
接下來解釋一下為什么題主你那樣寫不正確:
1.varTriangle=newShape();這句創建了一個Shape實例,而并沒有創建一個新的原型。
2.Triangle.prototype={};這句以及接下來的幾句都重新創建了一個原型,而并沒有修改原本的原型。
有什么疑問可以追問。
                            
查看完整回答
反對 回復 2019-04-13
  • 2 回答
  • 0 關注
  • 252 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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