在我对制作类似数组的对象的调查中,我制作了这个函数,
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 对于任何数字文字)并返回一个带有as和fornew Int
的“Int”对象,其中的数字可以通过,与不使用的调用相同。Empty
__proto__
undefined
prototype
.value
new
为什么这些非常相似的功能表现如此不同,为什么会new
导致第一个?这很可能是我忽略的显而易见的事情。
仅在谷歌浏览器中测试。