2017-12-27 26 views
1

学習していた呼び出し、適用、バインドトリオ。この出力は、和出力を添付機能definationが含まれていないのはなぜJavascriptで組み込みオブジェクトを拡張するにはどうすればいいですか?たとえば、Math?

Math.__proto__.sum = function(arg1){var res=0; for(i in arg1) res+=arg1[i]; return res; }; 
Math.sum([1,2,3]) 
//Output: "6function (arg1){var res=0; for(i in arg1) res+=arg1[i]; return res; }" 

はその後、これを試してみましたか?

このようなユーティリティメソッドを持つプロジェクトでは、Mathのような組み込みオブジェクトをどのように拡張して使いますか?

感謝:)

+0

ちょうど 'Math.sum =機能(){/ *ものを行う* /}' – mhodges

+0

を言うことができます@それはまったく同じ結果です。 – edam

+0

'for ... in'ではなく、配列に対して' for ... of'を使う必要があります。 'for ... in'を使うと、1,2,3、およびsum関数のすべてのプロトタイププロパティとプロパティを取得できます。これはsum関数で '.toString()'を呼び出し、それを前のプロパティの合計の答えに結び付けます。これはあなたが得ている出力を得る理由です。 – mhodges

答えて

3

(あなたは絶対に何をやっているを知っている限り)これは、あなたが__proto__と混乱しない理由の古典的な例です。列挙可能なプロパティとしてObject.prototypeに関数をアタッチすると、ArrayObjectに拡張されてから、for...inループ内で反復されます。この結果、関数は合計に連結され、文字列に変換されます。あなたはMathに機能を追加したい場合は

、ほとんどの目的のために、あなただけMathに直接割り当てることができます。

Math.sum = function() {...} 
1

JavaScriptのネイティブオブジェクトを変更することができます。もちろん

Math.sayHello = function(friend) { 
 
    alert('Hello there ' + friend); 
 
} 
 

 
Math.sayHello('buddy');

あなたが実際にメソッドを再定義する場合、これはすぐに厄介である可能性があります。

Math.ceil = function(x) { 
 
    return parseInt(x, 10); 
 
} 
 

 
console.log(Math.ceil(4.9));

+0

'Math.prototype'は定義されていません – mhodges

+1

Derp!更新された答え。 –

1

取るMath.maxと同様にMathためのメソッドを実装することをお勧めします折りたたまれた結果を返します。

Math.add = (...args) => args.reduce((a, b) => a + b, 0); 
 

 
console.log(Math.add(1, 2, 3)); 
 
console.log(Math.add(...[7, 8, 9]));

のみES5

Math.add = function() { 
 
    var i = arguments.length, 
 
     sum = 0; 
 

 
    while (i--) { 
 
     sum += arguments[i]; 
 
    } 
 
    return sum; 
 
}; 
 

 
console.log(Math.add(1, 2, 3)); 
 
console.log(Math.add.apply(null, [7, 8, 9]));

+0

こんにちは@ニーナ、非常にニース! **配列関数記法**を使用せずに実装できますか?また、なぜ私がうまくいかなかったのか説明してもらえますか? ** args.reduce **はES6 +の機能ですか? – edam

+0

['Array#reduce'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)はES5です。どの実装が必要ですか? –

+0

@edam配列に 'for ... of'の代わりに' for ... in'を使用していて、 'Array.prototype.reduce'はES6の機能ではありませんでした。長い間、 – mhodges

関連する問題