通过提供定义的句柄来创建一个新对象

4
这个Udacity游戏开发视频中,讲师提到Javascript允许我们通过给出其定义的句柄来创建对象。然后,它说为了实现这一点,“重载的对象定义将使用指向其类定义的指针更新哈希表”。我很清楚什么是哈希表、指针、重载方法和工厂模式,但我无法理解这个神秘的陈述或其他解释。
2个回答

4
“哈希表”只是说“普通的Javascript对象”的一种更加高级的说法。当讲师提到“其定义的句柄”时,他指的是作为该类构造函数的函数的另一种说法。
最终,他在所提到的语句中所指的是:
每个重载实体定义都将使用指向其类定义的指针更新哈希表。
这意味着Entity的所有“子类”将使用类型值作为键,在单个共享的哈希映射/对象中注册其构造函数。这允许您通过访问gGameEngine.factory[type]来获取构造函数(换句话说,调用new返回该实体的实例的函数)以获取任何类型。
这很好,因为每当程序员添加新类型的实体时,只要他们记得在gGameEngine.factory对象中添加具有正确键的新条目,那么该对象就包含构造任何类型支持的对象所需的所有内容。
因此,遍历关卡编辑器生成的JSON结构的代码可以以相同的方式创建任何类型的实例,例如:
var typeConstructor = gGameEngine.factory(tileSpec.type),
    instance;

if (typeConstructor) {
    instance = new(typeConstructor)(tileSpec /* or whatever params */);
}

这与您提供链接视频的1分钟左右可见的代码类似。
现在明白了吗?

差不多。那么,new(typeConstructor)new typeConstructor是等价的吗?这种语法有一个名称吗?我以前没见过。 - Federico
@Federico 我相信它们是等价的。只是加上括号可能会让正在发生的事情更清晰,我想。 - GregL

1
我认为他想表达的是你可以将另一个对象内的引用映射到函数、对象或变量。他使用了一种属性访问语法,但我认为他过于复杂化了,并使用了"handle"和"hash table"等术语。
var someClass = function () {
  // stuff
}

var containingObject = {};
containingObject["someClass"] = someClass;
// same thing as
containingObject.someClass = someClass;

然后,您可以通过调用containingObject属性来实例化该类。
var classInstance = new containingObject["someClass"]()
// or
var classInstance = new containingObject.someClass()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接