2017-01-23 13 views
0
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で何が起こっているのか理解できませんでした。上記のコードは私のために働くが、私はそれを理解したい。より次のjavascriptコードを理解しようとしています

いくつかの質問:

  • この実装は、すべてのブラウザで動作していますか?

  • 単一の派生クラスから2つの基本クラスを継承する方法はありますか?可能であれば、プロトタイプコンストラクタパターン(インターネット上でそれらを見つけ出し、そのパターンで上のコードを書いています)にそれらを実装する方法を教えてください。

  • このようなコードの記述は、パフォーマンスに影響しますか? (私はJavaScriptがプロトタイプ言語だと言われたのでこのパターンを選んだので、プロトタイプコンストラクタパターンにコードを書くことにしました)

  • 私たちは__proto__を使用できますか?私は__proto__の使用が推奨されていないことをインターネットで発見しました。

私のコードに間違ったことがあった場合は、それは本当に私にとって役に立ちます。

ありがとうございました!

+0

大文字でコンストラクタ名を開始するのが一般的ですが、コードを理解しやすくなります。また、コンストラクタの関数式よりも関数宣言を使用することを検討してください。 * Object.assign *を使用して、置き換えるのではなく、デフォルトの* constructor.prototype *を拡張することを検討してください。おそらくこれは* codereview *のほうがいいでしょうか? – RobG

+0

JavaScriptの専門家はまだいません。このリンクはお役に立ちます [link](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create) これは基本的なJavaScriptのようですので、これはすべてのブラウザで機能するはずです。 2つの基本クラスからの継承は、私の視点からは大きなノー・ノーであり、トラブルにつながる可能性があります。 パフォーマンスについても知りません。___proto___について 一般的に、コードはよく見えますが、** TypeScript **を使用することを検討してください。コードを読みやすくしてJavaScriptに変換し、すべてのブラウザがサポートされるようにします。ずっといい! –

+0

コンストラクタの名前を大文字で始めることを試みます。ありがとう@RobG –

答えて

0

上記のコードは私には役に立ちますが、私はそれを理解したいと思います。

プロトタイプ継承に関するウェブ上の記事や記事がたくさんあります。 MDN: Inheritance and the prototype chain

この実装はすべてのブラウザで機能しますか?

それはほとんどのだろうので、EMCA-262編5で導入されたObject.createを、サポートしているすべての。おそらくあなたはそうしない人(IE 8以下など)については気にしません。 polyfillを実装するのはかなり簡単です。

単一の派生クラスから2つの基本クラスを継承する方法はありますか?

ECMAScriptにはクラスがありません。コンストラクタとプロトタイプがあります(クラス構文もありますが、クラスを作成するわけではありません)。

とにかく、あなたはそれをやったと思います。それについてはさまざまな方法がありますが、最終結果はあなたがしたこととほぼ同じです。つまり、必要なプロトタイプオブジェクトは、コンストラクタ.prototype[[Prototype]]の上にスタックされているため、すべてインスタンスのプロトタイプチェーンになります。

可能であれば、プロトタイプコンストラクタパターン(私はインターネット上でそれらを見つけましたが、そのパターンで上記のコードを書いています)でそれらを実装する方法を教えてください。

あなたはそれをやったと思います。

このようなコードの記述は、パフォーマンスに影響しますか? (私はJavaScriptがプロトタイプ言語であると言われたのでこのパターンを選んだので、プロトタイプコンストラクタパターンにコードを書くことにしました)

パフォーマンスは何かに比べて何か影響がありますか?コンストラクタなしのプレーン関数?ありそうもない。これはセマンティクスの問題であり、コードを読んで理解したいと思う方法です。

protoを使用できますか?私はprotoの使用は非推奨であることをインターネットで発見しました。

でもお勧めしません。これはECMA-262の付録に追加されました。オブジェクトの[[Prototype]]に直接アクセスする必要がある場合は、それが何をしようとしているかをより良い方法で行う可能性があります。もちろん、例外もあります。

+0

すべての私の質問@RobGにお答えする時間を取ってくれてありがとう。ほとんどすべての私の質問に答えました。私は2つの基本クラスを継承することについて明確ではない。 1つの派生クラスに対して、私は1つの基本クラスから継承することができます。もしあなたが喜んでいるなら、別のクラスを追加して私に例を与え、ppLabelにそれらを継承することでこれを解決するのを助けてください。ありがとうございました!! –

+0

伝統的なコンストラクタやプロトタイプ構造でも行うことができる[* MND:Classes *](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Classes)を参照してください。新しいClass構​​文 – RobG

関連する問題