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__
。
如果我在代码中出错了,请随意说出来,这对我有用。
谢谢!!
答案 0 :(得分:0)
以上代码适合我,但我想了解它。
这里有很多很多问题和关于原型继承的网上文章,例如: MDN: Inheritance and the prototype chain
此实现是否适用于所有浏览器?
所有支持 Object.create ,这是EMCA-262 ed 5中引入的,所以这是最多的。也许你并不关心那些没有(例如IE 8及更低版本)。实现polyfill非常容易。
如何从单个派生类继承2个基类?
ECMAScript中没有类。有构造函数和原型(以及类语法,但它不会像这样创建类)。
无论如何,我认为你已经做到了。有不同的方法,但最终的结果几乎就是你所做的。也就是说,将所需的原型对象堆叠在 constructor.prototype 的[[Prototype]]
之上,这样它们就全都在实例的原型链上。
如果有可能,有人告诉我如何在原型构造函数模式中实现它们(我在互联网上找到它们,并且我已经在该模式中编写了上述代码)。
我认为你已经做到了。
这种编写代码会影响性能吗? (我选择了这种模式,因为据说JavaScript是原型语言。所以我决定在原型构造函数模式上编写代码)
影响性能的比较是什么?没有构造函数的普通函数?不太可能。这更多的是语义问题以及您喜欢阅读和理解代码的方式。
我们可以使用 proto 吗?我在互联网上发现不推荐使用 proto 。
你可以,但不建议这样做。它被添加到ECMA-262的附录中。如果您需要直接访问对象的[[Prototype]]
,则可能有更好的方法来执行您正在尝试的任何操作。但当然也有例外。