gpt4 book ai didi

javascript - 在两个相似函数中重载 __proto__ 的区别

转载 作者:行者123 更新时间:2023-11-29 15:45:10 26 4
gpt4 key购买 nike

在我对制作Array-like 对象的调查中,我制作了这个函数,

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 作为任何数字文字)和 new Int 返回一个“Int”对象,Empty__proto__undefinedprototype,带有通过 .value 可用的号码,与没有 new 的调用相同。

为什么这些非常相似的函数表现如此不同,为什么 new 导致第一个?这很可能是我忽略的明显问题。
仅在 Google Chrome 中测试过。

最佳答案

实际上,您的Array2 函数返回真正的 数组,而不仅仅是Array-like 对象,这在设置 时不会改变[[prototype]] 到一个继承自 Array.prototype 的对象(虽然你不应该使用 [] 创建一个数组,但是一个普通的对象使用Object.create(Array.prototype)

您的函数 Int 有几个问题。

out 是原始数值,没有属性。分配一些时,它将被隐式转换为 Number 对象,该对象随后被丢弃。 Int.prototype = 0 上的“constructor”属性也有同样的问题。

此外,您不能使用像 0 这样的原始值作为原型(prototype)对象。当创建一个 new Int 实例时,它将从默认的 Object.prototype 继承,因为 0 不是“object”类型。我不确定将此类分配给非标准 __proto__ 属性时会发生什么,但我猜它只是失败了。

改用这个:

function Int(n){
var out = ~~n;
this.valueOf = function(){ return out; };
return out; // when not used as a constructor, return int-casted number
};

Int.prototype = Object.create(Number.prototype, {
constructor:{value:Int}
});

关于javascript - 在两个相似函数中重载 __proto__ 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12605625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com