无名对象的简写符号

时间:2015-06-14 19:12:26

标签: javascript

所以,我首先在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”。有人可以请扩展一下吗?

衷心感谢,

3 个答案:

答案 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的演示,但代码和文本都没有特别清楚。我很难将代码补丁拼接在一起并使项目工作,我觉得用于建模问题的对象分解过于复杂。但是,我正在学习,所以我的意见完全是未经授权的; - )

结束咆哮