配列のようなオブジェクトを作成するための調査で、この関数を作成しました。
Array2 = function(){
var out = [];
Object.defineProperty(out, 'prototype', { value : Array2.prototype }); // store a reference
out.__proto__ = Array2.prototype; // necessary as Array uses __proto__ and not prototype
if(arguments.length > 1) Array.prototype.push.apply(out, arguments); // re-implement constructor's
else if(arguments.length === 1) out.length = arguments[0]; // argument handling behaviour
return out;
};
// allow for normal prototyping behaviour
Array2.prototype = [];
Object.defineProperty(Array2.prototype, 'constructor', { value : Array2 });
Array2()
そして、呼び出しが呼び出しと同じものを返すことに気づきましたnew Array2()
。これは私が期待していたものではないので、整数に対して同様の関数を検討しました。
Int = function(n){
var out = ~~n;
out.prototype = Int.prototype;
out.__proto__ = Int.prototype;
this.value = out; // added to check value when working as object
return out;
};
Int.prototype = 0;
Int.prototype.constructor = Int;
今回Int
は、Numberの通常のインスタンス(__proto__
およびprototype
任意の数値リテラル)を返し、。を使用せずに呼び出すのと同じように、を介して使用可能な番号を使用して、asおよびfornew Int
を含む「Int」オブジェクトを返します。Empty
__proto__
undefined
prototype
.value
new
これらの非常に類似した関数の動作が非常に異なるのはなぜnew
ですか。また、最初の関数が結果として得られるのはなぜですか。それはおそらく私が見落としていた明らかな何かです。
GoogleChromeでのみテストされています。