我想了解以下javascript代码

时间:2017-01-23 05:58:17

标签: javascript prototype

    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__

如果我在代码中出错了,请随意说出来,这对我有用。

谢谢!!

1 个答案:

答案 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]],则可能有更好的方法来执行您正在尝试的任何操作。但当然也有例外。