JavaScriptの「新しい」キーワードは有害と見なされますか?[閉まっている]


568

別の質問で、ユーザーはそのnewキーワードを使用するのは危険であると指摘し、使用しないオブジェクト作成の解決策を提案しましたnew。それが本当だとは思いませんでした。主に、Prototype、Scriptaculous、その他の優れたJavaScriptライブラリを使用していて、全員がnewキーワードを使用していたためです。

それにもかかわらず、昨日私はYUIシアターでダグラスクロックフォードの講演を見ていましたが、彼はまったく同じことを言っていnewました。彼はコードでキーワードをもう使用していません(JavaScriptのCrockford-Act III:Function the Ultimate-50:23分)。

newキーワードを使用するのは悪いことですか?それを使用することの利点と欠点は何ですか?


90
新しいキーワードを使用することは「悪い」ことではありません。しかし、それを忘れると、オブジェクトコンストラクターを通常の関数として呼び出すことになります。コンストラクターがその実行コンテキストをチェックしない場合、 'this'が新しいインスタンスではなく別のオブジェクト(通常はグローバルオブジェクト)を指していることに気付きません。したがって、コンストラクターはプロパティとメソッドをグローバルオブジェクト(ウィンドウ)に追加します。「this」がオブジェクト関数内のオブジェクトのインスタンスであることを常に確認する場合は、この問題は発生しません。
Kristian B

5
分かりません。一方では、ダグはの使用を妨げますnew。しかし、YUIライブラリを見ると、newどこでも使用する必要があります。などvar myDataSource = new Y.DataSource.IO({source:"./myScript.php"});
aditya_gaur 2011

2
@aditya_gaurこれは、オブジェクトの初期化が必要なinit場合に、Object.createアプローチを使用してメソッドを後から呼び出す必要があるためです。new両方を行い、プロトタイプチェーンを設定し、いくつかの初期化コードを呼び出すだけの方がはるかに簡単です。
ファンメンデス

67
これは閉鎖されるべきではなかったと思います。はい、それはいくつかのCrockfordの反ファンの毒を刺激する可能性が高いですが、ここでは基本的に主要な言語機能を回避するための一般的なアドバイスについて話しています。すべてのJQueryオブジェクトの重みがほとんどない(メモリが関係する場合)メカニズムには、「new」キーワードの使用が含まれます。常に新しいメソッドを呼び出すよりもファクトリーメソッドを優先しますが、オブジェクトリテラルのみを使用することでアーキテクチャーオプションとパフォーマンスの可能性を大幅に削減しないでください。彼らには彼らの場所があり、コンストラクタには彼らの場所があります。時代遅れでお粗末なアドバイスです。
Erik Reppen 2012

2
TLDR:使用newは危険ではありません。省略newは危険なため、悪い。しかし、ES5ではStrict Modeを使用できます。これにより、その危険やその他の多くの危険から保護されます。
jkdev

回答:


603

Crockfordは、優れたJavaScript技術を普及させるために多くのことを行いました。言語の主要な要素についての彼の意見に固執したスタンスは、多くの有益な議論を引き起こしました。とはいえ、「悪い」または「有害な」という宣言を福音とする人が多すぎて、一人の人の意見を超えて見ることを拒否しています。それは時々少しイライラすることができます。

newキーワードによって提供される機能を使用すると、各オブジェクトを最初から構築するよりもいくつかの利点があります。

  1. プロトタイプの継承。クラスベースのオブジェクト指向言語に慣れている人による疑惑と軽蔑の混合でよく見られますが、JavaScriptのネイティブ継承技術は、コードを再利用するためのシンプルで驚くほど効果的な手段です。そして、新しいキーワードは、それを使用するための標準的な(そして利用可能なクロスプラットフォームのみの)手段です。
  2. パフォーマンス。これは、#1の副作用である:私は私が作成したすべてのオブジェクトに10個のメソッドを追加したい場合は、私は可能性だけ手動でそれぞれの新しいオブジェクトへの各メソッドを割り当て作成機能を書く...それとも、私はそれらを割り当てることができます作成関数prototypenew新しいオブジェクトをスタンプするために使用します。これはより高速であるだけでなく(プロトタイプのすべてのメソッドにコードが不要)、メソッドごとに個別のプロパティを使用して各オブジェクトにバルーニングを回避できます。低速のマシン(または特に低速のJSインタープリター)では、多くのオブジェクトが作成されているため、時間とメモリーを大幅に節約できます。

そして、はい、new重大な欠点が1つあります。他の回答で説明されているように、それを使用し忘れると、コードは警告なしに壊れます。幸い、その欠点は簡単に軽減されます。関数自体にコードを少し追加するだけです。

function foo()
{
   // if user accidentally omits the new keyword, this will 
   // silently correct the problem...
   if ( !(this instanceof foo) )
      return new foo();

   // constructor logic follows...
}

これでnew、誤って誤用したことによる問題を心配する必要がないという利点があります。壊れたコードのサイレント動作が気になる場合は、チェックにアサーションを追加することもできます。あるいは、いくつかはコメントし、実行時例外を導入するために、チェックを使用します。

if ( !(this instanceof arguments.callee) ) 
   throw new Error("Constructor called as a function");

(前の例とは異なり、実際にオブジェクトをインスタンス化する必要がないため、このスニペットはコンストラクター関数名のハードコーディングを回避できることに注意してください。したがって、変更せずに各ターゲット関数にコピーできます。)

John Resigは、彼のシンプルな「クラス」インスタンス化の投稿でこの手法について詳しく説明し、この動作をデフォルトで「クラス」に組み込む手段を含めています。確かに価値Aは読んだ...彼の今後の本、であるとして、JavaScriptの忍者の秘密(この中に隠し金を発見し、他の多くの「有害」はJavaScript言語の特徴、にはwith、特に最初に却下人たちのもののために啓発されたが、ギミックとしてこの非常に悪質な機能)。


96
if(!(this instanceof arguments.callee))throw Error( "関数として呼び出されたコンストラクタ"); //より一般的、コンストラクタ名の知識を必要としない場合は、ユーザーにコードを修正させます。
いくつかの

5
パフォーマンスが心配で、実際にそうする理由がある場合は、チェックをまったく行わないでください。を忘れずに使用するnewか、ラッパー関数を使用して覚えてください。私は疑うあなたの創造コールがとにかくローカライズされますので...、あなたはそれが重要なポイントにしている場合、あなたはすでに、このようなメモ化として排出他の最適化をしたこと
Shog9

65
がstrictモードでは使用できないため、でarguments.callee呼び出されたかどうかを確認するためにを使用するnewことは、あまり良くarguments.calleeない場合があります。関数名を使用することをお勧めします。
Sean McMillan

69
識別子のスペルを間違えると、コードが壊れます。識別子を使用すべきではありませんか?newあなたがコードでそれを書くことを忘れることができるので使用しないことは私の例と同じくらいばかげています。
Thomas Eding、2011年

16
strictモードをオンにした場合、newの使用を忘れると、これを使用しようとすると例外が発生します。yuiblog.com / blog / 2010 / 12 / 14 / strict-mode-is-coming-to-townつまり各コンストラクタにチェックのインスタンスを追加するよりも簡単です。
ステファンベス2013年

182

彼のクロックフォードの本「Javascript:The Good Parts」の一部を読んだところです。私は彼がこれまで彼を噛んだすべてのものを有害であると考えているという感覚を得ます:

スイッチフォールスルーについて:

スイッチケースが次のケースに移行することを許可しません。フォールスルーがなぜ有用なのかについて活発なスピーチをした直後に、意図しないフォールスルーによって引き起こされたコードのバグをかつて見つけました。(97ページ、ISBN 978-0-596-51774-8)

++と-について

++(インクリメント)および-(デクリメント)演算子は、過剰なトリッキーを助長することにより、不正なコードに寄与することが知られています。ウイルスやその他のセキュリティ上の脅威を可能にする点で、アーキテクチャの欠陥に次いで2番目です。(122ページ)

新規について:

コンストラクター関数を呼び出すときに新しいプレフィックスを含めるのを忘れた場合、これは新しいオブジェクトにバインドされません。悲しいことに、これ はグローバルオブジェクトにバインドされるため、新しいオブジェクトを拡張する代わりに、グローバル変数を破壊します。それは本当に悪いです。コンパイル警告はなく、実行時警告もありません。(49ページ)

他にもありますが、写真を撮っていただければ幸いです。

あなたの質問に対する私の答え:いいえ、それは有害ではありません。しかし、あなたがあなたがいくつかの問題を抱えている可能性があるときにそれを使用することを忘れた場合。良い環境で開発しているなら、それに気づくでしょう。

更新

この回答が書かれてから約1年後、ECMAScriptの第5版がリリースされ、strictモードがサポートされました。厳密モードでthisは、はグローバルオブジェクトにバインドされなくなり、にバインドされundefinedます。


3
同意します。解決策:ユーザーがオブジェクトをインスタンス化する方法を常に文書化します。例を使用すると、ユーザーは切り取り/貼り付けを行う可能性があります。すべての言語には、誤用されて通常とは異なる動作や予期しない動作を引き起こす可能性のある構成要素/機能があります。それはそれらを有害にしません。
nicerobot 2008

45
常に大文字でコンストラクターを開始し、その他のすべての関数は小文字で開始するという規則があります。
いくつかの

61
私はちょうどクロックフォードが...有害WHILE ...私は、変数をインクリメントするのを忘れてきたので、私は無限ループを作成しているどのように多くの時間がわからない考えていないことに気づいた
いくつかの

5
同じことが++にも当てはまります。彼らは私が意図していることを可能な限り明確な言葉で正確に表現しています。大好き!スイッチのフォールスルーは一部の人にとっては明らかかもしれませんが、私はそれらにうんざりしています。私はそれらが明らかにより明確であるときにそれらを使用します(しゃれが原因で、抵抗できなかった)。
PEZ、

30
Crockfordへの私の答え:プログラミングは難しいです。買い物に行きましょう。シーッシュ!
Jason Jackson、

91

JavaScriptは動的言語であるため、別の言語があなたを止めるところを台無しにする無数の方法があります。

失敗するnew可能性があるなどの基本的な言語機能を回避することは、靴が泥だらけになる可能性がある場合に備えて地雷原を歩く前に光沢のある新しい靴を脱ぐようなものです。

関数名が小文字で始まり、実際にクラス定義である「関数」が大文字で始まるという規則を使用しています。結果は、「構文」が間違っているという非常に説得力のある視覚的な手掛かりです:-

var o = MyClass();  // this is clearly wrong.

この良い命名習慣に加えて、役立ちます。結局のところ、関数は物事を行うため、その名前には動詞が必要ですが、クラスはオブジェクトを表し、動詞のない名詞および形容詞です。

var o = chair() // Executing chair is daft.
var o = createChair() // makes sense.

SOの構文カラーリングが上記のコードをどのように解釈したかは興味深いです。


8
ええ、私は構文の色分けについて同じことを考えていました。
BobbyShaftoe 2008

4
「関数」という単語を入力するのを忘れたとき。この言葉は絶対に避けなければならない。また、複数行のif / thenステートメントで中括弧を使用していませんでした。だから今は中括弧を使わず、1行の条件文を書くだけです。
Hal50000

「これは明らかに間違っている」。どうして?私のクラス(単純にif (! this instanceof MyClass) return new MyClass())では、実際にはnew-less構文を好みます。どうして?そのための機能がより一般的でコンストラクタ関数。除外newすると、コンストラクター関数を通常の関数に簡単に変更できます...またはその逆。newコードを追加すると、コードが必要以上に具体的になります。したがって、柔軟性が低くなります。呼び出し側が実装を選択できるようにするList代わりに受け入れることが推奨されるJavaと比較してくださいArrayList
Stijn de Witt

41

私はJavascriptの初心者なので、これについて良い見方をするのはあまり経験がないのかもしれません。しかし、私はこの「新しい」ことについての私の見解を共有したいと思います。

私はC#の世界から来ましたが、「新しい」というキーワードを使用するのは自然で、工場の設計パターンが奇妙に見えます。

JavaScriptで最初にコードを作成したとき、YUIパターンのような「新しい」キーワードとコードがあることに気付かず、災害に遭遇するまでに時間がかかりません。記述したコードを振り返ると、特定の行が何をしているのか分からなくなります。さらに混沌としているのは、コードを「ドライラン」しているとき、私の心がオブジェクトインスタンスの境界間を実際に移動できないことです。

それから、私はそれを「分離」する「新しい」キーワードを見つけました。新しいキーワードで、それはものを作成します。新しいキーワードがなければ、私が呼び出している関数がその強力な手掛かりを与えない限り、私はそれをものの作成と混同しないことを知っています。

たとえば、var bar=foo();バーが何であるかについての手掛かりはありません。戻り値ですか、それとも新しく作成されたオブジェクトですか?しかし、var bar = new foo();確かにバーはオブジェクトです。


3
同意し、ファクトリパターンはmakeFoo()のような命名規則に従う必要があると思います
pluckyglen

3
+1-「新しい」の存在は、より明確な意図の表明を与えます。
ベルガボブ2009年

4
JSのほとんどすべてがオブジェクトである場合、この応答は奇妙なものです。すべての関数がオブジェクトである場合に、関数がオブジェクトであることを確認する必要があるのはなぜですか?
ジョシュアラミレス

@JoshuaRamirezポイントはそれではありませんtypeof new foo() == "object"。それはそれだnewのインスタンスを返すfoo、とあなたが呼び出すことができます知っているfoo.bar()foo.bang()。しかし、それは簡単に使用することによって緩和することができるJSDocのの@return私は(言葉を避け手続き型コードを提唱していないことnew
フアン・メンデス

1
@JuanMendesうーん...あなたの投稿は、あなたのコードベースに明示的なキーワードがあるため、あなたが新しく好きだと私に思わせました。私はそれを掘ることができます。そのため、モジュールパターンを使用しています。createFoo、NewFoo、MakeFooという関数を用意します。明示的な関数であれば問題ありません。その中で、関数から返されるオブジェクトリテラルの内部でクロージャとして使用される変数を宣言しています。そのオブジェクトリテラルは最終的にオブジェクトになり、関数は単なる構築関数でした。
ジョシュアラミレス

39

別のケースのための新しい、私は呼んでいますプーコーディング。くまのプーさんはおなかに従います。私はあなたが使用している言語に反対するのではなくそれに従っていると言います。

おそらく、言語のメンテナーは、彼らが奨励しようとしているイディオムのために言語を最適化するでしょう。新しいキーワードを言語に入れる場合、おそらく新しいインスタンスを作成するときに明確にするのが理にかなっていると思います。

言語の意図に従って書かれたコードは、リリースごとに効率が向上します。そして、言語の主要な構成要素を回避するコードは、時間とともに苦しみます。

編集:これはパフォーマンスをはるかに超えています。「なぜそんなことをしたの?」と聞いた(または言った)回数を数えることはできません。奇妙に見えるコードを見つけたとき。多くの場合、コードが作成された時点で、その「正当な」理由がいくつかあったことがわかります。言語のタオに従うことは、あなたのコードが今から数年馬鹿にされないためのあなたの最高の保険です。


3
Pooh Codingリンクの+
1-

笑!私はその分野で長年の経験があり、問題が発生しないことを保証します。彼らはしばしば私をrobowiki.netでプーさんと呼んでいます。=)
PEZ

1
このコメントが表示されるかどうかはわかりませんが、そのPooh Codingリンクは機能していません。
カルバン

ヘッドアップをありがとう。先週robowiki.netを新しいwikiに移行しましたが、現時点では古いコンテンツにアクセスできません。これらの古いリンクを機能させるために急いでいきます。
PEZ

24

私は、新しいキーワードなしでコンストラクターを呼び出す問題を緩和する方法についての投稿を書きました。
それはほとんど教訓的ですが、それはあなたがテストのボイラープレートコードnew追加することを必要とせずに、またはなしで動作するコンストラクタを作成する方法を示していますthis、すべてのコンストラクターで。

http://js-bits.blogspot.com/2010/08/constructors-without-using-new.html

テクニックの要点は次のとおりです。

/**
 * Wraps the passed in constructor so it works with
 * or without the new keyword
 * @param {Function} realCtor The constructor function.
 *    Note that this is going to be wrapped
 *    and should not be used directly 
 */
function ctor(realCtor){
  // This is going to be the actual constructor
  return function wrapperCtor(){
    var obj; // object that will be created
    if (this instanceof wrapperCtor) {
      // Called with new
      obj = this;
    } else {
      // Called without new. Create an empty object of the
      // correct type without running that constructor
      surrogateCtor.prototype = wrapperCtor.prototype;
      obj = new surrogateCtor();
    }
    // Call the real constructor function
    realCtor.apply(obj, arguments);
    return obj;
  }

  function surrogateCtor() {}
}

使用方法は次のとおりです。

// Create our point constructor
Point = ctor(function(x,y){
  this.x = x;
  this.y = y;
});

// This is good
var pt = new Point(20,30);
// This is OK also
var pt2 = Point(20,30);

6
回避arguments.calleeは素晴らしいです!
Gregg Lind

2
surrogateConstructorsurrogateCtor(またはその逆)でなければなりません。
デビッドコンラッド

私は同様のクロックフォードにインスパイアされたユーティリティのコレクションを維持していましたが、新しいプロジェクトを開始するときは常に実装を見つけるために実行する必要がありました。そして、これはプログラミングのそのような基本的な部分、つまりオブジェクトのインスタンス化をラップします。このすべての作業は、無計画なインスタンス化コードを有効にするためだけですか?私はこのラッパーの創意工夫に正直に感謝しますが、不注意なコーディングを引き起こしているようです。
Joe Coder 2016年

1
@joecoder私はこれが教訓的な目的のためだけであることを言及しました、私はこのパラノイア形式のコーディングに同意しません。しかし、私はクラスライブラリを書いていた場合は、[はい、私は発信者に対して透過的な方法でこの機能を追加します
フアン・メンデス

22

新しいキーワードを使用しない理由は簡単です。

まったく使用しないことで、誤って省略した場合の落とし穴を回避できます。YUIが使用する構成パターンは、新しいキーワードを完全に回避する方法の一例です」

var foo = function () {
    var pub= { };
    return pub;
}
var bar = foo();

または、次のようにすることもできます。

function foo() { }
var bar = new foo();

しかし、そうすることによって、あなたが使用することを忘れて誰かのリスクを実行新しいキーワードを、そしてこの演算子がすべてfubarになるリスクを負います。私の知る限り、これに慣れることには慣れていません(あなたがそれに慣れていることを除いて)。

一日の終わりに:それは防御であることについてです。 新しいステートメントを使用できますか?はい。それはあなたのコードをより危険にしますか?はい。

C ++を作成したことがある場合は、ポインターを削除した後でポインターをNULLに設定するのと同じです。


6
いいえ。「new foo()」を使用すると、返されたオブジェクトにコンストラクタなどのいくつかのプロパティが設定されます。
いくつかの

34
だから、これを明確にするために、忘れてしまうかもしれないので「new」を使うべきではないのですか?冗談でしょ?
Bombe

16
@Bombe:他の言語では "new"を忘れるとエラーになります。Javascriptでは、それはトラックを続けるだけです。あなたは忘れることができ、決して気付かない。そして、エラーのあるコードを見るだけでは、何がうまくいかないのかは明らかではありません。
ケントフレドリック

3
@Greg:最初の手法でプロトタイプチェーンを使用する方法がわかりません-オブジェクトリテラルは素晴らしいですが、プロトタイプによって提供されるパフォーマンスやその他の利点を恐怖から捨てることは少しばかげているようです。
Shog9 2008

5
@Bombe-あなた(およびあなたのコードを使用する人)は間違いを犯さないので、「new」を使用する必要がありますか?冗談でしょ?
グレッグディーン

20

「新規」はコードを明確にするものだと思います。そして、明快さはすべての価値があります。落とし穴があることを知っておくのは良いことですが、明快さを回避することによってそれらを回避することは、私にとっての方法のようには思えません。


16

ケース1:new必須ではなく、回避する必要がある

var str = new String('asd');  // type: object
var str = String('asd');      // type: string

var num = new Number(12);     // type: object
var num = Number(12);         // type: number

ケース2:new必須、それ以外の場合はエラーが発生します

new Date().getFullYear();     // correct, returns the current year, i.e. 2010
Date().getFullYear();         // invalid, returns an error

5
ケース1では、コンストラクターを関数として呼び出しても、型変換を行う場合にのみ意味があります(ハルオブジェクトにのような変換メソッドがあるかどうかはわかりませんtoString())。それ以外の場合はすべて、リテラルを使用します。 そうではなく String('asd')、単に'asd'、そしてそうではなく Number(12)、単に12
PointedEars

1
この規則の唯一の例外は次のようになり@PointedEars ArrayArray(5).fill(0) より読みやすく、明らかである[undefined, undefined, undefined, undefined, undefined].fill(0)(var arr = []).length = 5; arr.fill(0);
yyny

@YoYoYonnY私のステートメントはnewプリミティブ型に対応するオブジェクト型のwithコンストラクターの使用を参照する回答のケース1のコンテキストで作成されました。あなたが提案しているリテラルは呼び出し(try )と同等ではなく、残りは構文エラーです:)それ以外の場合は正しいですが、非準拠の実装を検討する場合はあいまいになる可能性があることにも注意してください(そしてしたがって、エミュレートされた)。Array0 in …Array(5) Array.prototype.fill(…)
PointedEars 2015

12

これは、演算子の使用に関する賛成と反対の2つの最も強力な議論のうち、私が作成できる最も簡単な要約ですnew

反対論 new

  1. new演算子を使用してオブジェクトとしてインスタンス化されるように設計された関数 は、通常の関数として誤って呼び出されると、悲惨な影響を与える可能性があります。このような場合の関数のコードは、意図したローカルオブジェクトのスコープではなく、関数が呼び出されたスコープで実行されます。これにより、グローバル変数およびプロパティが上書きされ、悲惨な結果が生じる可能性があります。
  2. 最後に、オブジェクトを構築する ために呼び出すことができるようにを記述しfunction Func()、それに呼び出してオブジェクトFunc.prototypeを追加することはnew Func()、構造的およびスタイル上の理由でオブジェクト継承の別のスタイルを使用するプログラマにとっては醜いようです。

この議論の詳細については、ダグラス・クロックフォードの素晴らしい簡潔な本「Javascript:The Good Parts」をご覧ください。実際、とにかくそれをチェックしてください。

賛成の議論 new

  1. new演算子をプロトタイプの割り当てと一緒に使用すると高速です。
  2. グローバルネームスペースでコンストラクター関数のコードを誤って実行することは、コンストラクター関数に常にコードが含まれていて、それらが正しく呼び出されているかどうかを確認し、そうでない場合は簡単に防ぐことができます。 、必要に応じて適切に呼び出しを処理します。

この手法の簡単な説明と、彼が提唱する継承モデルの一般的な詳細については、John Resigの投稿を参照してください。


引数に対する更新:#1は'use strict';、モード(またはリンクのメソッド)を使用して軽減できます。#2 ES6にはSynatic Sugar がありますが、動作は以前と同じです。
ninMonkey 2015

9

私はここでペッツといくつかに同意します。

「新規」は自己記述的なオブジェクト作成であり、Greg Deanが記述するYUIパターンが完全に隠されていることは、私には明らかなようです。

誰かが書く可能性var bar = foo;var bar = baz();、bazがオブジェクト作成メソッドではない可能性は、はるかに危険なようです。


8

新しいことは悪いことだと思います。誤って使用することを忘れると問題が発生する可能性があるのではなく、継承チェーンがめちゃくちゃになり、言語が理解しにくくなるためです。

JavaScriptはプロトタイプベースのオブジェクト指向です。したがって、すべてのオブジェクトは、そのような別のオブジェクトから作成する必要がありますvar newObj=Object.create(oldObj)。ここでoldObjnewObjのプロトタイプと呼ばれます(したがって「プロトタイプベース」)。これは、プロパティがnewObjで見つからない場合、oldObjで検索されることを意味します。 したがって、デフォルトではnewObjは空のオブジェクトになりますが、そのプロトタイプチェーンにより、oldObjのすべての値を持っているように見えます。

一方、行う場合var newObj=new oldObj()newObjのプロトタイプはoldObj.prototypeですであり、不必要に理解することが困難です。

トリックは使用することです

Object.create=function(proto){
  var F = function(){};
  F.prototype = proto;
  var instance = new F();
  return instance;
};

この関数の内部にあり、ここでのみnewを使用する必要があります。その後、単にObject.create()メソッドを使用します。このメソッドはプロトタイプの問題を解決します。


7
正直なところ、私はこのテクニックに夢中です-それは新しいものを追加しません、そしてあなたの答えが示すようにそれは松葉杖になることさえありえます。私見、プロトタイプチェーンとオブジェクトのインスタンス化を理解することは、JavaScriptを理解する上で非常に重要です...しかし、それらを直接使用するのが不快になる場合は、ヘルパー関数を使用して詳細を処理することで問題ありません。やっている。FWIW:これの(やや便利な)バリエーションはECMAScript 5 edの一部です。std、および一部のブラウザーでは既に使用可能です。そのため、盲目的に再定義しないように注意してください。
Shog9 2010

ところで、なぜこのCWを作成したのかは
わかりませ

2
不必要に理解するのは難しいですか?var c = new Car()するのと同じですvar c = Object.create(Car.prototype); Car.call(c)
ファンメンデス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.