我试图理解以下javascript代码 var ppElement=function(str_elmt){ this.tagName=(str_elmt==null)?“div”:str_elmt; } 原型={ 建造商:ppElement, ppCreate:function(){ 返回document.createElement(此.tagName); }, ppAppend:function(){ var prntObj=参数[0]; 对于(var i=1;i

我试图理解以下javascript代码 var ppElement=function(str_elmt){ this.tagName=(str_elmt==null)?“div”:str_elmt; } 原型={ 建造商:ppElement, ppCreate:function(){ 返回document.createElement(此.tagName); }, ppAppend:function(){ var prntObj=参数[0]; 对于(var i=1;i,javascript,prototype,Javascript,Prototype,上面的代码适合我,但我想理解它 这里有很多关于原型继承的问题和web上的文章,例如 这个实现在所有浏览器中都能工作吗 EMCA-262 ed 5中引入的所有support Object.create都是如此。也许你不在乎那些不支持的(例如IE 8和更低版本)。实现一个 如何从单个派生类继承2个基类 ECMAScript中没有类,有构造函数和原型(还有类语法,但它不创建类本身) 无论如何,我认为你已经做到了。有不同的方法可以做到这一点,但最终的结果与你所做的差不多。也就是说,将所需的原型对象堆叠在

上面的代码适合我,但我想理解它

这里有很多关于原型继承的问题和web上的文章,例如

这个实现在所有浏览器中都能工作吗

EMCA-262 ed 5中引入的所有support Object.create都是如此。也许你不在乎那些不支持的(例如IE 8和更低版本)。实现一个

如何从单个派生类继承2个基类

ECMAScript中没有类,有构造函数和原型(还有类语法,但它不创建类本身)

无论如何,我认为你已经做到了。有不同的方法可以做到这一点,但最终的结果与你所做的差不多。也就是说,将所需的原型对象堆叠在构造函数的顶部。原型的
[[prototype]]]
因此它们都位于实例的原型链上

如果可能的话,有人告诉我如何在原型构造函数模式中实现它们(我在互联网上找到了它们,并且我已经在该模式中编写了上述代码)

我想你已经做到了

这种编写代码的方式会影响性能吗?(我选择这种模式是因为据说JavaScript是原型语言。所以我决定在原型构造函数模式上编写代码)

与什么相比会影响性能?没有构造函数的普通函数?不太可能。更多的是语义问题以及您喜欢如何阅读和理解代码

我们可以使用proto吗?我在互联网上发现proto的使用不受欢迎


可以,但不推荐。它已添加到ECMA-262的附录中。如果需要访问对象的
[[Prototype]]直接有可能做一个更好的方法来做你想做的任何事情。但是当然也有例外。

用大写字母来构造构造函数名称是惯例,它使代码更容易理解。此外,考虑使用函数声明而不是构造函数的函数表达式。ing Object.assign扩展默认构造函数.prototype而不是替换它。也许这在codereview上更好?我还不是JavaScript专家,所以这个链接可能会帮助你[link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create)它看起来像是基本的JavaScript,所以它应该在所有浏览器上工作。从我的观点来看,从2个基类继承是一个很大的问题。它可能只会导致麻烦。DON< /Case> T知道性能,也不知道代码一般看起来很好,但是……考虑使用Type Script。它会使代码更可读,对它也有帮助。堆到JavaScript,所以所有浏览器都受支持。更好!我会尝试用大写字母开始构造函数的名称。感谢@RobGThank你花时间回答我所有的问题@RobG。几乎你已经回答了我所有的问题。我不清楚继承两个基类。对于一个派生类,我可以继承只从一个基类开始。如果您愿意,请给我一个例子,通过添加另一个类并将它们继承到ppLabel来帮助解决这个问题。谢谢!!看,这也可以用传统的构造函数和原型结构来完成,但大多数人似乎喜欢新的类语法。
    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();
    /*=====================================*/