所以,我首先在Marijn Haverbeke的Eloquent Javascript中潜入并直接游到Electronic Life章。
我们观察到物体的自发生成:
{"#": Wall,"o": BouncingCritter}
Wall和BouncingCritter的定义是:
function Wall() {}
function BouncingCritter() {
this.direction = randomElement(directionNames);
this.name = word();
};
BouncingCritter.prototype.act = function(view) {
if (view.look(this.direction) != " ")
this.direction = view.find(" ") || "s";
return {type: "move", direction: this.direction};
};
BouncingCritter.prototype.toString=function(){
return this.name +"\t"+ this.direction;
}
--->我没有得到那里发生的巫术。 好吧,我看到我们正在动态创建一个对象,因为它只会被使用一次,所以不需要定义一个类。好。 据我所知,到目前为止,这个匿名对象有两个属性,它们本身就是类,将在未来几次实例化。我开始颤抖,但我会相处。其中一个(Wall)是空的,后来证明是有用的,因为“没有”比“未定义”更好一些。细
我没有得到的是在冒号的左侧使用字符串常量“#”和“o”。有人可以请扩展一下吗?
衷心感谢,
答案 0 :(得分:2)
我没有得到的是在冒号的左侧使用字符串常量“#”和“o”。有人可以请扩展一下吗?
该属性必须被称为某事。这些只是相当无益的名字,它们不会告诉你属性实际上是什么。
......直到你看上下文。从您提供的链接:
此计划中的“#”字符代表墙壁和岩石,而“o”字符代表生物。
它使用#
作为wall属性的名称,因为它是用于在UI中呈现它的符号。同上“o”/ citter。
(但这仍然不是一个好名字:它将内部名称紧密耦合到它的呈现,如果UI后来改为使用(例如)漂亮的图形而不是ASCII艺术,它将开始崩溃)
答案 1 :(得分:1)
在这种情况下,它更像是一个词典。它只是用来表示字符#或o分别代表类Wall和BouncingCritter。
编辑(尽可能快地阅读你的书之后):当他实现World(map, legend)
时,传说就是词典。稍后在代码中他创建了网格,并且对于世界字符串表示中的每个字符,他根据他给出的var element = new legend[ch]();
的图例字典来设置正确的类。
答案 2 :(得分:0)
好的伙计们,谢谢你的回答。我进一步挖了一下,对于对象文字表示法的方式,我发现了一个非常清晰简洁(确实如此)的解释:Nifty Javascript - Objects。
最初在
中最让我困惑的是什么{"#": Wall,"o": BouncingCritter}
是属性名称周围的引号,以及“#”否则将成为属性名称的非法字符。
为了解决这个问题,我不得不把它写下来,我将在下面分享它的价值。
“传奇”是我们构建世界时定义的匿名无类对象, 块{“#”:Wall,“o”:BouncingCritter}
Marjin说:
A legend is an object that tells us what each character
in the map means. It contains a constructor for every
character—except for the space character, which always
refers to null, the value we’ll use to represent empty
space.
在World构造函数中,我们根据我们的内容填充grid.space数组 从'map'读取(由数组'plan'实例化)。 从地图中读取的字符(“o”或“#”)作为关键字 哈希表(a.k.a“对象”)'传奇'。相应的值是一个类(或者是 'Wall'或'BouncingCritter')然后被实例化。结果对象是 最后存储在grid.space数组中。
请注意原始文字符号{“#”:Wall,“o”:BouncingCritter} for 创建和随后在函数中使用方括号 'elementFromChar'
var element = new legend[ch]();
允许使用 否则非法字符'#'作为财产的名称。
这是咆哮:
毋庸置疑,我对这一切并不满意。我猜这种特技会让javascript有时候声名狼借。总而言之,我开始认为这本书的标题“Eloquent Javascript”可能有点过分甚至是误导。 当然,这是一个令人印象深刻的对象fu maestria的演示,但代码和文本都没有特别清楚。我很难将代码补丁拼接在一起并使项目工作,我觉得用于建模问题的对象分解过于复杂。但是,我正在学习,所以我的意见完全是未经授权的; - )
结束咆哮