[英]I am trying to understand the following javascript code
var ppElement=function(str_elmt){
this.tagName=(str_elmt==null)?"div":str_elmt;
}
ppElement.prototype={
constructor:ppElement,
ppCreate:function(){
return document.createElement(this.tagName);
},
ppAppend:function(){
var prntObj=arguments[0];
for(var i=1;i<arguments.length;i++){
prntObj.appendChild(arguments[i]);
}
}
};
/*=====================================*/
var ppLabel=function(str_txt){
this.text=str_txt;
}
ppLabel.prototype=Object.create(ppElement.prototype,{
constructor:ppLabel,
ppCreateLabel:{
value:function(){
var obj,txtObj;
ppElement.call(this);
obj=this.ppCreate();
txtObj=document.createTextNode(this.text);
this.ppAppend(obj,txtObj);
return obj;
}
}
});
/*=====================================*/
var tempObj=new ppLabel("Jeff");
tempObj.ppCreateLabel();
/*=====================================*/
這段代碼是我寫的。 我試圖使用object.create從ppLabel繼承ppElement的方法。 我對object.create有點困惑。 我不明白object.create中正在發生什么。 上面的代碼對我有用,但是我想理解。
幾個問題:
此實現在所有瀏覽器中都適用嗎?
如何從單個派生類的2個基類繼承? 如果可能的話,有人告訴我如何以原型構造器模式實現它們(我在網上找到了它們,並且我已經以該模式編寫了上面的代碼)。
這種編寫代碼會影響性能嗎? (我之所以選擇此模式,是因為據說JavaScript是原型語言。因此,我決定將代碼編寫在原型構造函數模式下)
我們可以使用__proto__
嗎? 我在互聯網上發現__proto__
的使用已被棄用。
如果我的代碼有任何錯誤,請隨時聲明,這對我真的很有幫助。
謝謝!!
上面的代碼對我有用,但是我想理解。
關於原型繼承,這里和網上有很多很多問題,例如MDN:繼承和原型鏈 。
此實現在所有瀏覽器中都適用嗎?
所有支持Object.create的內容(在EMCA-262第5版中引入)都將是最多的。 也許您不關心那些不關心的內容(例如IE 8及更低版本)。 實現polyfill非常容易。
如何從單個派生類的2個基類繼承?
ECMAScript中沒有類。 有構造函數和原型(還有類語法,但它不會像這樣創建類)。
無論如何,我認為您已經做到了。 有多種解決方法,但最終結果幾乎就是您所做的。 也就是說,將所需的原型對象堆疊在Constructor.prototype的[[Prototype]]
之上,以便它們全部位於實例的原型鏈上。
如果可能的話,有人告訴我如何以原型構造器模式實現它們(我在網上找到了它們,並且我已經以該模式編寫了上面的代碼)。
我想你已經做到了。
這種編寫代碼會影響性能嗎? (我之所以選擇此模式,是因為據說JavaScript是原型語言。因此,我決定將代碼編寫在原型構造函數模式下)
相較於性能表現呢? 沒有構造函數的純函數? 不太可能。 這更多地取決於語義以及您喜歡如何閱讀和理解代碼。
我們可以使用原型嗎? 我在互聯網上發現不贊成使用Proto 。
您可以,但不建議這樣做。 它已添加到ECMA-262的附錄中。 如果您需要直接訪問對象的[[Prototype]]
,則可能有更好的方法來執行您要嘗試執行的操作。 但是當然也有例外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.