gpt4 book ai didi

javascript - 为什么在 Array 的子类中设置位置不会改变它的长度?我不应该继承数组吗?

转载 作者:搜寻专家 更新时间:2023-11-01 04:58:29 26 4
gpt4 key购买 nike

在下面的 CoffeeScript 程序中,我创建了一个 Array 的子类,它在其构造函数中设置了两个位置:

class SetPositionsArray extends Array
constructor: (x,y) ->
@[0] = x
@[1] = y

myLength: ->
@length

sp_array = new SetPositionsArray 1, 2

console.log "sp_array: "
console.log sp_array
console.log "sp_array[0]: "
console.log sp_array[0]
console.log "sp_array[1]: "
console.log sp_array[1]
console.log "sp_array.length: "
console.log sp_array.length
console.log "sp_array.myLength(): "
console.log sp_array.myLength()

我希望这段代码能改变 sp_arraylength 属性,因为它有效地设置了它的位置。但是,我得到的输出是:

$ coffee sp.coffee
sp_array:
[ 1, 2 ]
sp_array[0]:
1
sp_array[1]:
2
sp_array.length:
0
sp_array.myLength():
0

即长度为0。

然后,我创建了另一个类,它在实例中推送值而不是设置它们:

class PushValuesArray extends Array
constructor: (x,y) ->
@push x
@push y

myLength: ->
@length


pv_array = new PushValuesArray 1, 2


console.log "pv_array: "
console.log pv_array
console.log "pv_array[0]: "
console.log pv_array[0]
console.log "pv_array[1]: "
console.log pv_array[1]
console.log "pv_array.length: "
console.log pv_array.length
console.log "pv_array.myLength(): "
console.log pv_array.myLength()

在这种情况下,我得到了预期的结果,除了数组中有一个 actual length 属性(虽然我认为它会是一些内部细节):

$ coffee pv.coffee
pv_array:
[ 1, 2, length: 2 ]
pv_array[0]:
1
pv_array[1]:
2
pv_array.length:
2
pv_array.myLength():
2

那么,为什么设置数组中的位置不会改变它的长度呢?

这个问题与 this one 有关为此我发布了this answer .

最佳答案

最简单的解释是:length 很神奇。

length 显然不像普通属性,因为当您在其对象上插入/删除其他属性时它会更改其值(相反,设置 length = 0 将删除其他属性);但是标识符“长度”没有什么特别之处。这意味着您可以轻松编写 foo.length = 'bar',世界将继续转动。只有在数组上才有它的特殊性。

现在,您可能希望当您扩展 Array 构造函数时,您会得到一个数组——但是您呢?嗯,从某种意义上说,你这样做:

class PushValuesArray extends Array
(new PushValuesArray) instanceof Array # true

不幸的是,为了 length 的目的,你不需要。 extends 关键字在这里所做的只是创建一个原型(prototype)链,数组 prototype 具有明显非魔法的 length 属性:

Array::length  # 0

这就是您在 PushValuesArray 实例上获得的全部内容。遗憾的是,没有办法在您自己的对象上复制 length 魔法。您唯一的选择是改为编写一个函数(例如,size()),或者使用您想要的方法修改Array 原型(prototype)并改用真正的数组。

总结:子类化Array不会让你走得太远。这就是为什么,例如,jQuery 在其对象上有一个非常类似于数组的 API —

$('body').length  # 1
$('body')[0] # [object HTMLBodyElement]

——但实际上并没有使这些对象继承自 Array 原型(prototype):

$('body') instanceof Array  # false

关于javascript - 为什么在 Array 的子类中设置位置不会改变它的长度?我不应该继承数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7450354/

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