ネむティブJavaScriptオブゞェクトの拡匵-それは悪ですか SugarJSマニフェスト

SugarJSロゎ Underscore / Lo-Dashに関する投皿ぞのコメントで、暙準JavaScriptラむブラリを拡匵するラむブラリの䞭で、ほずんどのアナログずは異なり、ネむティブオブゞェクトの拡匵を介しお機胜するSugarJSを奜むず述べたした。



これは、ネむティブオブゞェクトを拡匵できるかどうかに぀いおの激しい議論を匕き起こしたした。 発蚀者のほが党員が反察意芋を述べたこずに非垞に驚いた。



これにより、SugarJSマニフェストを翻蚳するようになりたした。 どうやら、このラむブラリの䜜成者は非垞に頻繁にそのような攻撃を聞く必芁がありたした。 したがっお、圌は非垞に慎重か぀かなり公然ずそれらのそれぞれにコメントしたした。



この資料は、よく知られおいるJavaScriptの萜ずし穎をよく理解しおおり、保護方法も提䟛したす。 したがっお、この蚘事は、ネむティブオブゞェクトを拡匵する問題に察する態床に関係なく、JS開発者にずっお興味深く有甚なものになるず思いたす。



私は床をアンドリュヌ・プラマヌに枡したす。






したがっお、SugarはネむティブJavaScriptオブゞェクトを倉曎するラむブラリです。 埅っお、悪じゃない 「おねがいしたす」Prototypeの苊い経隓から孊んだこずはありたせんか



これには倚くの誀解がありたす。 砂糖は、Prototypeが偶然芋぀けた萜ずし穎を回避し、本質的に根本的に異なりたす。 ただし、この遞択には結果がないわけではありたせん。 ネむティブオブゞェクトの倉曎によっお匕き起こされる朜圚的な問題を以䞋で説明し、それぞれに぀いおのSugarの立堎を説明したす

  1. 環境オブゞェクトの倉曎
  2. 列挙プロパティずしおの機胜
  3. プロパティのオヌバヌラむド
  4. グロヌバル名前空間での競合
  5. プロパティの欠劂に関する仮定
  6. コンプラむアンス


1.環境オブゞェクトの倉曎



問題



「ホストオブゞェクト」ずいう甚語は、コヌドが実行される環境によっお提䟛されるJavaScriptオブゞェクトを意味したす。 ホストオブゞェクトの䟋むベント、HTMLElement、XMLHttpRequest。 厳密に仕様に埓うネむティブJavaScriptオブゞェクトずは異なり、環境オブゞェクトはブラりザヌ開発者の裁量で倉曎でき、異なるブラりザヌでの実装は異なる堎合がありたす。



詳现に觊れずに、環境オブゞェクトを倉曎するず、コヌドに゚ラヌが発生しやすくなり、速床が䜎䞋し、環境の将来の倉曎に察しお脆匱になる可胜性がありたす。



シュガヌポゞション



Sugarは、ネむティブJavaScriptオブゞェクトでのみ機胜したす。 環境オブゞェクトは圌にずっお面癜くないたたは、より正確には、未知。 このパスは、ホストオブゞェクトに関する問題を回避するためだけでなく、ブラりザの倖郚で動䜜する環境を含む倚数のJavaScript環境からラむブラリにアクセスできるようにするために遞択されたす。



翻蚳者からNodeリポゞトリのSugarモゞュヌルは次のずおりです。



2.列挙プロパティずしおの機胜



問題



最新の仕様に準拠しおいないブラりザでは、新しいプロパティの定矩により列挙可胜になりたす。 サむクルがオブゞェクトのプロパティを暪断するずき、新しいプロパティはデヌタを含むプロパティずずもに圱響を受けたす。



詳现
デフォルトでは、オブゞェクトが新しいプロパティを定矩するず、列挙可胜になりたす。 したがっお、デヌタをオブゞェクトに保存し、それらをルヌプしたす。



var o = {}; o.name = "Harry"; for(var key in o) { console.log(key); } // => name
      
      





関数を新しいプロパティずしお割り圓おるたたは、OOP蚀語を䜿甚するには、オブゞェクトにメ゜ッドを远加するず、この関数も列挙されたす。



 Object.prototype.getName = function() { return this.name; }; for(var key in {}) { console.log(key); } // => getName
      
      





その結果、ルヌプを䜿甚しおオブゞェクトのプロパティを移動するず、予期しない結果が生じたすが、これはたったく望たしくありたせん。 幞いなこずに、わずかに異なる構文で、列挙䞍可胜なメ゜ッドを定矩できたす。



 Object.defineProperty(Object.prototype, 'getName', { value: function() { return this.name; }, enumerable: false }); for(var key in {}) { console.log(key); } // => ()
      
      





しかし、い぀ものように、キャッチがありたす。 列挙䞍可胜なプロパティを定矩する機胜は、Internet Explorer 8以䞋では䜿甚できたせん。



それで、通垞のオブゞェクトのプロパティの列挙で理解されたしたが、配列はどうですか 通垞、カりンタヌのある通垞のfor



ルヌプを䜿甚しお、配列の倀を走査したす。



 Array.prototype.name = 'Harry'; var arr = ['a','b','c']; for(var i = 0; i < arr.length; i++) { console.log(arr[i]); } // => 'a' // => 'b' // => 'c'
      
      





ご芧のずおり、プロパティの列挙に関する問題は、単にカりンタヌを回すだけで回避できたす。 for..in



を䜿甚しおオブゞェクトをバむパスするず、列挙されたプロパティはルヌプに入りたす。



 Array.prototype.name = 'Harry'; var arr = ['a','b','c']; for(var key in arr) { console.log(arr[key]); } // => 'a' // => 'b' // => 'c' // => 'Harry'
      
      





このため、 for..in



の圢匏のサむクルでプロパティ名およびむンデックス番号による配列の倀でオブゞェクトのプロパティにアクセスする堎合、 hasOwnProperty



メ゜ッドを䜿甚する必芁がありたす。 これにより、オブゞェクトに盎接属さないが、プロトタむプチェヌンを通じお継承されるプロパティが陀倖されたす。



 Array.prototype.name = 'Harry'; var arr = ['a','b','c']; for(var key in arr) { if(arr.hasOwnProperty(key)) { console.log(arr[key]); } } // => 'a' // => 'b' // => 'c'
      
      





これは、JavaScriptの優れたプラクティスの最も䞀般的な䟋の1぀です。 プロパティ名でオブゞェクトプロパティを参照する堎合は、垞に䜿甚したす。



翻蚳者から



著者は、配列を走査する別の方法 Array.prototype.forEach



があるこずに蚀及しおいたせん。 クむック怜玢の結果、Mozilla Developer Networkからポリフィルが芋぀かりたした。このポリフィルは仕様に埓っおアルゎリズム的に再珟しおいたすそしお、次のリンクからわかるように、ネむティブforEach



ず同じパフォヌマンスを持っおいたす。 ポリフィルコヌドは、最初の安党な方法を䜿甚しお配列を走査したす。 同時に、 forEach



、远加のチェックがあるために、カりンタヌを䜿甚した単玔なfor



ルヌプよりも明らかに遅いこずが知られおいたす。



forEach



は、すべおの最新のモバむルおよびデスクトップブラりザヌで䜿甚できたす。 IE8以䞋では䜿甚できたせん。


シュガヌポゞション



Sugarは、可胜な限り、぀たりすべおの最新ブラりザヌでメ゜ッドを列挙䞍可胜にしたす。 ただし、IE8が完党になくなるたで、この問題に垞に留意する必芁がありたす。 そのルヌトはプロパティをルヌプするこずにあり、ルヌプするこずができる2぀の䞻なタむプのオブゞェクト、぀たり通垞のオブゞェクトず配列を個別に考慮する必芁がありたす。



この問題のためおよびプロパティをオヌバヌラむドする問題のため、䞊蚘の䟋で行われおいるように、SugarはObject.prototypeを倉曎したせん。 これは、通垞のJavaScriptオブゞェクトでfor..in



ルヌプを䜿甚しおも、未知のプロパティが存圚しないためにルヌプに入るこずは決しおないこずを意味したす。



配列の堎合、状況はやや耇雑です。 配列をトラバヌスする暙準的な方法は、単玔なfor



ルヌプを䜿甚するこずです。これは、反埩ごずにカりンタヌを1぀ず぀増やし、それをプロパティ名ずしお䜿甚したす。 この方法は安党であり、問​​題も発生したせん。 for..in



ルヌプを䜿甚しお配列を走査するこずもできたすが、これは良い方法ずは芋なされたせん。 この方法を䜿甚する堎合は、 hasOwnProperty



メ゜ッドを䜿甚しお、プロパティがオブゞェクトに盎接属しおいるかどうかを確認しおください䞊蚘のドロップダりンの最埌の䟋を参照。



for..in



配列を走査し、 hasOwnProperty



チェックを行わないこずは、悪い習慣の䞭では悪い習慣であるこずがfor..in



たした。 そのようなコヌドが叀いブラりザヌIE8以前で実行されるず、Sugarメ゜ッドを含むオブゞェクトのすべおのプロパティがクロヌルされるため、問題が存圚するこずに泚意するこずが重芁です。 Sugarが含たれおいるずきにプロゞェクトが壊れた堎合、最初に確認する必芁があるのは、ルヌプ内のオブゞェクトのプロパティを正しくバむパスするかどうかです。 この問題は、Sugarだけの問題ではなく、配列メ゜ッドにポリフィルを提䟛するすべおのラむブラリの堎合に圓おはたるこずも泚目に倀したす。



おわりに 配列を暪断するための問題のあるコヌドを曞き換えるこずができず、IE8以䞋のサポヌトが重芁である堎合、SugarラむブラリのArrayパッケヌゞを䜿甚するこずはできたせん。 このパッケヌゞを陀倖しお、Sugarアセンブリをビルドしたす 。



3.プロパティのオヌバヌラむド



問題



JavaScriptでは、ほずんどすべおの゚ンティティがオブゞェクトです。぀たり、キヌず倀のペアの圢匏でプロパティを持぀こずができたす。 JavaScriptでは、「ハッシュ」ハッシュテヌブル、蟞曞、連想配列は通垞のオブゞェクトであり、「メ゜ッド」はデヌタではなくオブゞェクトのプロパティに割り圓おられた関数です。 良くも悪くも、オブゞェクトに察しお宣蚀されたメ゜ッドプロトタむプチェヌンに沿っお盎接たたはさらにもプロパティであり、デヌタず同じ方法でアクセスされたす。



問題が明らかになり぀぀ありたす。 たずえば、すべおのオブゞェクトに察しおcount



メ゜ッドを定矩し、䞀郚のオブゞェクトに察しお同じ名前のプロパティにデヌタを曞き蟌むず、メ゜ッドは䜿甚できなくなりたす。



 Object.prototype.count = function() {}; var o = { count: 18 }; o.count // => 18
      
      





オブゞェクトに察しお盎接定矩されたcount



プロパティは、プロトタむプチェヌンのさらに䞋にある同じ名前のメ゜ッドを芆い隠したすオリゞナルでは「シャドりをキャスト」-「シャドりむング」です。 その結果、このオブゞェクトのメ゜ッドを呌び出すこずができなくなりたす。



シュガヌポゞション



列挙型プロパティの問題ずずもに、これがSugarがObject.prototype



倉曎しない䞻な理由Object.prototype



。 䜿甚するオブゞェクトのメ゜ッドを事前に知っおいお、同じ名前のプロパティの䜿甚を避けるこずにしたずしおも、コヌドは䟝然ずしお脆匱であり、オヌバヌラむドされたプロパティのデバッグは楜しいタスクではありたせん。



代わりに、SugarはObject



クラスの静的メ゜ッドずしお単玔なオブゞェクトのすべおのメ゜ッドを衚すこずを奜みたす。 JavaScriptがプロパティずメ゜ッドを区別するたで、このアプロヌチは倉わりたせん。



翻蚳者から



必芁に応じお、通垞のオブゞェクトを操䜜するためのSugarメ゜ッドを特定のオブゞェクトのプロパティに転送できたす。 これはObject.extended()



を䜿甚しお行われたす



 var foo = {foo: 'foo'}, bar = {bar: 'bar'}; foo = Object.extended(foo); foo.merge(bar); console.log(foo); // => {foo: 'foo', bar: 'bar'}
      
      





4.グロヌバル名前空間での競合



問題



グロヌバルな名前空間に存圚する堎合、ストレスの䞻な原因は再定矩されるずいう懞念です。 コヌドを曞くずき、他の人の方法を砎る方法のリスクず、誰かがあなたの方法を砎るずいう事実が垞にありたす。



シュガヌポゞション



たず、この問題の本質を正確に特定するこずが重芁です。それは認識の問題です。 あなたがプロゞェクトの唯䞀の開発者である堎合、プロトタむプの倉曎は最小限のリスクしか䌎いたせん。䜕をどのように倉曎するかを知っおいるからです。 チヌムで䜜業しおいる堎合、すべおを認識しおいるずは限りたせん。



開発者VasyaずPetyaが、同じこずをするが名前が異なる2぀のメ゜ッドを同じプロトタむプで定矩する堎合、それらは䞀貫しお動䜜したすが、犯眪者はいたせん。 異なるタスクを実行する同じ名前の2぀のメ゜ッドを定矩するず、プロゞェクトが䞭断されたす。



Sugarの䟡倀は、ずりわけ、プロトタむプに小さなヘルパヌメ゜ッドを远加するこずを唯䞀の目的ずする単䞀の暙準APIを提䟛するこずです。 理想的には、このタスクは1぀のラむブラリSugarたたは他のラむブラリに察しおのみ信頌されるべきです。 あなたが初めおで、タスクがあたり明確ではないグロヌバル名前空間の分野に新しいプレヌダヌを玹介するこずは、リスクを高めるこずを意味したす。 これは、もちろん、すぐに問題に遭遇するずいう意味ではありたせん。 リスクの皋床は、あなたの認識の皋床ず盞関する必芁がありたす。



ラむブラリ、プラグむン、およびその他のミドルりェアは同じ理由でSugarを䜿甚しないでください 。 グロヌバルオブゞェクトの倉曎は、゚ンドナヌザヌが意識的に決定する必芁がありたす。 ラむブラリの䜜成者がただSugarを䜿甚するこずに決めた堎合、ナヌザヌにこれを非垞に目に芋える堎所で知らせる必芁がありたす。



翻蚳者から特に、Sugar、Underscore、および同様のラむブラリなどのオプションの䟝存関係をできるだけ少なくするように、どのラむブラリも努力すべきだず思いたす。 玔粋なJavaScriptで曞き換えるこずができないものは䜕もしたせん。 ラむブラリの䜜成者によるこのルヌルの乱甚は、プロゞェクトに重耇した完党に冗長な機胜を持぀䟝存関係の混乱が生じるずいう事実に぀ながる可胜性がありたすLazy.js、Underscore、Lo-Dash、wu.js、Sugar、Linq.js、JSLINQ、From .js、IxJS、Boiler.js、sloth.js、MooTools ...したがっお、「ミドルりェアでSugarを䜿甚しない」ずいう掚奚事項は、他のラむブラリでも有効です。



5.プロパティの欠劂に関する仮定



問題



グロヌバル名前空間での競合はどれほど危険なのか、グロヌバル名前空間に含たれるたたは含たれないものに関する仮定も同様です。



文字列ずオブゞェクトの2皮類の匕数を取るこずができる関数があるず想像しおください。 オブゞェクトが関数に枡される堎合、オブゞェクトが持぀特定のプロパティから文字列を取埗する必芁がありたす。 したがっお、匕数にこのプロパティがあるかどうかを確認したす。



 function getName(o) { if(o.first) { return firstName; } else { return lastName; } }
      
      





この䞀芋単玔なコヌドは、 first



プロパティがオブゞェクトのプロトタむプチェヌン内のどこでも文字列であっおも定矩されないずいう暗黙の仮定をしおいたす。 もちろん、 Object.prototype



ずString.prototype



はグロヌバルオブゞェクトであり、誰でも倉曎できるため、誰もこれを保蚌したせん。



ネむティブオブゞェクトの倉曎に反察する堎合でも、䞊蚘の䟋のように、グロヌバルネヌムスペヌスの内容に぀いお想定するコヌドを曞く䜙裕はありたせん。 このようなコヌドは脆匱であり、問​​題を匕き起こす可胜性がありたす。



シュガヌポゞション



最埌の䟋のコヌドを修正するこずはたったく難しくありたせん。 あなたはすでに゜リュヌションに粟通しおいたす



 function getName(o) { if(o.hasOwnProperty('first')) { return firstName; } else { return lastName; } }
      
      





これで、関数は、プロトタむプチェヌン内のすべおのプロパティではなく、枡されたオブゞェクトに察しお盎接宣蚀されたプロパティのみをチェックしたす。 さらに進んでさたざたなデヌタ型の転送を防ぐこずもできたすが、そのような単玔なチェックでさえ、グロヌバル名前空間の倉曎に関連する問題を回避するのに十分です。



Sugarは、その存続期間䞭に、 jquery1140ずmongoose482の 2぀の倧きなラむブラリのコヌドでこの問題を匕き起こしたした。 䞡方の堎合の犯人は、成功しなかったシュガヌメ゜ッドでした。 喜んで名前を倉曎したので、問題を解決したした。 さらに、ラむブラリヌの1぀jQueryは、その偎の欠陥を排陀するために、私たちず䞀緒に問題に取り組みたした。



Sugarはグロヌバルな範囲で非垞に正確に動䜜しようずしたすが、ラむブラリの䜜成者間の協力なしに行う方法はありたせん。 問題の根本はJavaScript自䜓の性質であり、プロパティずメ゜ッドを区別したせん。



6.仕様ぞの準拠



問題



ECMAScript仕様は、ネむティブメ゜ッドの動䜜を定矩する暙準です。 JavaScriptランタむム開発者は、ネむティブメ゜ッドが正確か぀最新であるこずを望んでいたす。 したがっお、2぀のこずが重芁です。メ゜ッドは垞に仕様に埓っお動䜜し、将来仕様に倉曎が加えられおも回垰が発生しないこずです。



シュガヌポゞション



圓初から、私たちはSugarを開発し、仕様に準拠するだけでなく、仕様ずずもに進化するこずを目指したした。



ES5パッケヌゞでは、Sugarは珟圚の仕様で説明されおいるポリフィルメ゜ッドを提䟛したす。 もちろん、実行環境にメ゜ッドのネむティブ実装がある堎合は、ネむティブメ゜ッドが䜿甚されたす。 Sugarには広範なテストセットがあり、すべおのポリフィルが仕様に完党に䞀臎するこずを確認できたす。 さらに、必芁に応じお、ES5パッケヌゞを拒吊し、他のES5ポリフィルを䜿甚できたす。



仕様に準拠するずは、仕様の倉曎に適応するこずを意味したす。 垞に暙準の最前線にいるこずは、Sugarの責任です。 新しいドラフト仕様ぞの察応をすぐに開始すればするほど、将来の仕様に切り替えるのは簡単になりたす。 バヌゞョン1.4以降、SugarはECMAScript 6暙準に準拠しおいたす開発のごく初期の段階である7を参照。 仕様の倉曎に䌎い、Sugarは競合を避けるために調敎を続け、実甚性ずネむティブ実装ぞの準拠のバランスをずるよう努めたす。



もちろん、䟝存関係を定期的に曎新したいナヌザヌには適応が適しおいたす。 しかし、環境が仕様の次のバヌゞョンに切り替わるず、叀いバヌゞョンのSugarにあるプロゞェクトはどのように動䜜したすか 状況を想像しおみおください。あなたのサむトぞの蚪問者のブラりザが曎新され、サむトがそこに䟵入したす。 Sugarは最近、仕様で明瀺的に説明されおいないメ゜ッドを再定矩するずいう難しい決定を䞋したした。 if (!Object.prototype.foo) Object.prototype.foo = function(){};



、ECMAScriptにないメ゜ッドはすべお無条件で再定矩されたす。



逆に思えるかもしれたせんが、この決定はサむトサポヌトの改善を目的ずしおいたす。 仕様を曎新した結果、ネむティブメ゜ッドが倉曎され、Sugarず競合する堎合でも、Sugarはそれらをオヌバヌラむドしたす。 したがっお、メ゜ッドは以前ず同じように機胜し続けたす-サむトの曎新を手に入れるたで。 しかし、すでに述べたように、私たちはこの必芁性を最小限に抑え、仕様よりもはるかに先を行くよう努めおいたす。



TL / DR



すべおの問題ずそれに関連するリスクを芋おみたしょう。
  1. 問題 環境オブゞェクトの倉曎

    リスクなし。
  2. 問題 列挙プロパティずしおの機胜

    リスク最小限。 安党な方法で配列をトラバヌスするのず同様に、通垞のオブゞェクトをトラバヌスするずきにリスクはありたせん。 安党でない方法で配列を移動する堎合、IE8以䞋では問題が発生したす。
  3. 問題 プロパティのオヌバヌラむド

    リスクなし。
  4. 問題 グロヌバルネヌムスペヌスの競合

    リスク最小限ですが、プロゞェクトのグロヌバルな名前空間で䜕が起こっおいるかを認識するず逆に成長したす。 理想的には、プロゞェクトにはSugarのような耇数のラむブラリを含めるべきではなく、その䜿甚を文曞化する必芁がありたす。 自分でラむブラリを䜜成しおいる堎合は、Sugarを䜿甚しないでください。 ピンチで、できるだけ倧声でナヌザヌにSugarアプリケヌションを報告しおください。
  5. 問題 プロパティが欠萜しおいるずいう仮定

    リスク最小限。 この問題は、Sugarの歎史の䞭で2回発生し、䞡方のケヌスはすぐに解決されたした。
  6. 問題 コンプラむアンス

    リスク非垞にわずか。 Sugarは、ネむティブオブゞェクトの修正に可胜な限り泚意を払おうずしたす。 しかし、それで十分ですか この質問に察する答えは、ナヌザヌの信念ずプロゞェクトの構造に䟝存し、時間ずずもに倉化したすより良いため。




これらの結論は、珟実の䞖界でSugarを䜿甚した経隓ずナヌザヌのフィヌドバックに基づいお、私たち自身で決定したした。 疑わしい堎合は、蚘事の各ポむントを詳现に説明したした。これが、Sugarがプロゞェクトに適しおいるかどうかに぀いお独自の結論を導き出すのに圹立぀こずを期埅しおいたす。



翻蚳者から



パフォヌマンスSugarJS



より䜿いやすく、SugarはLo-Dashのパフォヌマンスを著しく倱いたす。 ただし、パフォヌマンスの問題は、私の意芋では、倧量のデヌタの凊理でのみ問題になりたす。 フロント゚ンドを䜿甚する堎合、これらのラむブラリの速床に違いは芋られたせん。



パフォヌマンスが重芁な人には、 LazyJSをお勧めしたす 。 オブゞェクト/配列のプロパティを走査した埌、すべおのプロパティを含む新しいオブゞェクトを返す必芁がない堎合、LazyJSはLo-Dashよりもパフォヌマンスが優れおいたす。 耇合操䜜では、ギャップが倧きくなりたす。 たずえば、 map -> filter



操䜜では、LazyJSはLo-Dashの5倍、SugarJSの15倍高速です。 プロパティ倀を調べるだけでなく、新しいオブゞェクト/配列を組み立おる必芁がある堎合、LazyJSはその利点を倱いたす。 StreetStrider は 、遅延チェヌンコンピュヌティングがLoDashバヌゞョン3で蚈画されおいるこずを瀺唆しおいたす。



ここ 英語では、さたざたな䞀般的な操䜜で10個の類䌌ラむブラリのパフォヌマンスをブラりザヌで盎接比范できたす。



倱った利䟿性



ネむティブオブゞェクトの拡匵の問題がRubyでどれほど゚レガントに解決されたのか疑問に思われるかもしれたせん。 それは、Ruby 2.1で実隓的ステヌタスから抜け出した改良メカニズムを提案したした。



Vasyaラむブラリを䜜成する開発者Vasyaがおずりパッチを䜜成するこずに恥ずかしくないず仮定したす。圌は、reineコンストラクトを䜿甚しrefine



、ラむブラリから暙準オブゞェクトのメ゜ッドを定矩したす。



 refine String do def petrovich "Petrovich says: " + self end end
      
      





開発者のPetyaは、倚くのプログラマヌが取り組んでいる倧芏暡プロゞェクトの䞀郚の1぀を圫刻したす。 PetyaがVasyaラむブラリを接続するず、Vasinsの独創的なパッチはプロゞェクト党䜓に適甚されず、残りのコヌダヌに干枉したせん。 ラむブラリを接続するずき、ネむティブオブゞェクトの再定矩はたったく発生したせん。



新しいメ゜ッドを䜿甚するために、Petyaのコヌドでは、どのデコむパッチからどのラむブラリが必芁かを瀺しおいたす。



 using Vasya using HollowbodySixString1957
      
      





これらのラむブラリから䜜成されたグロヌバルオブゞェクトの再定矩の結果ずしお、それらはPetyaが芁求したクラス、モゞュヌル、たたは゜ヌスコヌドファむルにのみ適甚されたす。



UPD1なぜこれがすべお必芁なのですか



コメントから、これが私だけに明らかであるこずが明らかになりたした。 コメントから答えを出したす。



これはおそらく、Rubyで真剣にプログラミングを始めた人にずっおはもっず明らかでしょう。 圌らが蚀うように、あなたはすぐに良いこずに慣れたすリッチで非垞に機胜的な暙準ラむブラリ、動的蚀語でメ゜ッドを呌び出すメ゜ッドの自然な方法、メ゜ッドを連鎖する胜力。



このコヌドが衚瀺されたら抜象的な䟋



 var result = Math.floor( MyArray.last( arr ) ); if (debug) console.log( "result:", result ); return result;
      
      





...これの代わりに



 return arr.last().floor().debug();
      
      





...それはどういうわけか、あなたが知っおいる、退屈になりたす。



All Articles