gpt4 book ai didi

javascript - 对象构造函数作为大对象中的函数

转载 作者:行者123 更新时间:2023-11-30 16:00:23 24 4
gpt4 key购买 nike

由于关键搜索词重叠,这真的很难找到。我正在制作这个电路游戏。仅供引用,就样式而言,我对对象使用全大写名称,尽管它们可能会稍有变化(例如 number_of_boards 或其他),但不会重复用于其他事物,但属性名称被重复使用(例如,如果我在一页上有我的凯尔特结发生器和电路游戏,我将有 KNOT.drawCIRCUIT_BOARD.draw)

所以,这是我当前设置的简短版本:

CIRCUIT_BOARD = {
"blankGridSquare": function(){
//Returns brand new object that is one blank grid square of the map
}
, "blankMap": function(width,height){
//Returns brand new object that has a bunch of blank grid squares
}
, "copyMap": function(map){
//Returns new object with the same value as parameter map
}
, "newBoard": function(svg,width,height,ioPlugs,map){
//Returns new object with a target svg,
//either a blank map or a copy of the given map,
//a set of ioPlugs,
//the electric current set up,
//etc.
//Initializes a few other things
}
// and other functions of course...
}

我不想摆脱将所有函数包装在一个变量中的做法,因为我想要在一页上放置多个游戏的灵 active 。我读过正确地构造构造函数涉及使用 this 关键字。但是,每当我尝试对这些构造函数使用 this 时,我都会得到,例如,一张 map ,上面附有一堆函数,其中每个 gridSquare 也都附有所有这些函数。

所以问题是如何将多个对象构造函数制作为非实例绑定(bind)函数,这些函数都是另一个对象的属性?我什至不知道这个浓缩问题的措辞是否正确。

最佳答案

这正是模块使用的模式。例如:

export function FooCtor() {
this.stuff = 3;
}

将变成:

exports.FooCtor = FooCtor;
function FooCtor() {
this.stuff = 3;
}

在对象中包含构造函数(只是函数)不会导致任何问题。

您遇到的困惑,as Pointy mentioned , 是关于 new 运算符在函数调用中对 this 所做的事情。如果您针对可以合理充当构造函数的函数调用 new,则运行时会将一个新上下文与分配给 this 的大部分为空的对象放在一起,并调用功能。这与做的并不完全不同:

newInstance = FooCtor.call({}, ...args)

通过规范找出发生这种情况的原因:

§12.3.3 开头规范(new 运算符),它说:

MemberExpression : new MemberExpression Arguments

  1. Return EvaluateNew(MemberExpression, Arguments).

EvaluateNew 将我们引向 §12.3.3.1.1 ,其中第 3-4 步说:

Let ref be the result of evaluating constructProduction. Let constructor be GetValue(ref).

它将通过任何属性访问器链向下工作(foo.barfoo[bar],等等)。接下来,同一部分的第 9 步说:

Return Construct(constructor, argList).

通向 §7.3.13以及构造过程的内部行为。

请注意,EvaluateNew 的第 9 步没有newTarget 参数指定给 Construct,这会触发第 1 步在构造中:

If newTarget was not passed, let newTarget be F.

Construct 的第 5 步将执行交给构造函数的 [[Construct]] 属性,定义在 §9.2.2。 .第 8 步指出:

If kind is "base", perform OrdinaryCallBindThis(F, calleeContext, thisArgument).

所以我们回到 5.a 中 thisArgument 的定义:

Let thisArgument be OrdinaryCreateFromConstructor(newTarget, "%ObjectPrototype%").

这使我们反弹到 §9.1.14 ,实际上(最终)开始创建新对象以用作构造函数的上下文:

The abstract operation OrdinaryCreateFromConstructor creates an ordinary object whose [[Prototype]] value is retrieved from a constructor’s prototype property, if it exists. Otherwise the intrinsic named by intrinsicDefaultProto is used for [[Prototype]].

此时我们离构造函数的访问方式还有很远的距离。 new 并不关心,只要它获得一个作为构造函数有意义的函数即可。如果你给它一个合理的功能,这个链只是建立一个新对象并处理所有原型(prototype)链接的东西。

关于javascript - 对象构造函数作为大对象中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37863741/

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