Can';我似乎不理解这个javascript代码!如果(!this.class)

Can';我似乎不理解这个javascript代码!如果(!this.class),javascript,Javascript,这里是javascript的新手 因此,我一直在尝试学习使用Raphael.js,并遇到了这段代码 现在如果你看第167行,有一个“如果”语句我不明白 Raphael.el.style = function (state, style, aniOptions) { if (!this.class) { this.class = style ? style : 'default'; this.aniOptions = aniOpti

这里是javascript的新手

因此,我一直在尝试学习使用Raphael.js,并遇到了这段代码

现在如果你看第167行,有一个“如果”语句我不明白

   Raphael.el.style = function (state, style, aniOptions)
    {
     if (!this.class)
     {
        this.class = style ? style : 'default';
        this.aniOptions = aniOptions ? aniOptions : null;

        // start assigning some basic behaviors
        this.mouseover(function () { this.style('hover'); });
    .... 
什么课?它返回什么?谁在退呢


它到底在检查什么?它是否是一个类?

它检查属性
是否已定义,如果未定义,则将其指定给
样式?style:“default”

您看到的只是一个条件语句,将其视为一个缩写的if-else子句,它检查
style
的计算结果是真是假,如果是真的
这个类将具有
style
的值,如果不是,它将获得
的“default”值

我不知道raphael.js是如何工作的,但在我看来它只是一个html元素类。

从中,
raphael.el
是一种将自己的方法添加到
raphael.element
类的方法。一般来说,此类的目的是使操作SVG元素更容易

代码示例中的this.class
和前面句子中使用的编程意义上的单词class无关。就我所见,它也不是标准拉斐尔框架的一部分。它也不是指HTML和SVG元素可以具有的
class
属性,通常在javascript中使用
element.className
element.setAttribute('class','…')
访问该属性

引用元素包装器对象(Raphael.element的实例),并且似乎编写此方法的人只是使用名称
在元素包装器中存储了一些附加信息。(正如评论中指出的,这可能是一个坏主意,因为
class
在javascript中是一个保留关键字;但无论如何,它是有效的。)

具体地说,在本例中,
this.class
最初是
未定义的
,因为它在Raphael或代码中的任何其他地方都没有被赋值。在
if
子句中,
!未定义的
计算结果为
,在下一行中,没有向
样式
的函数传递任何值,因此
样式?样式:“默认值”
计算结果为“默认值”。因此
this.class
被赋值为“default”。然后,如果右键单击某个形状并选择“使用自定义样式”,则该形状的
类将变为“自定义”

请注意,javascript非常容易让您引用未在任何地方初始化的对象的属性,并为其赋值。如果没有赋值,它不会抛出错误,只会返回
undefined

您可以通过在浏览器控制台中插入一行日志来查看所有这些内容:

console.log('style', state, style, aniOptions, this, 'class:', this.class);

然后使用浏览器的开发人员工具查看输出()。

“您也可以将其编写为”-如果(!this.class)
,则它不是100%等同于
。我会从答案中删除它。在
if
语句的正上方,键入
console.log(this)并激活浏览器控制台。然后重新运行JSFIDLE来查看对象。我不会在JavaScript中使用
class
作为属性名,以避免在将来的ECMAScript版本中出现混淆。它只是检查
this
class
属性是否有(falsy)值。如果您不熟悉对象,请查看。再次检查this.class的计算结果是否为false。。。嗯,没有?它检查
style
是虚假的还是真实的。它将结果分配给
这个.class
。总的来说,它是这样的:“如果
这个.class
没有值,如果它有值,就为它指定
样式
,否则
“默认”
,然后做一些其他事情。”@FelixKling感谢你指出了我答案中的
非常糟糕的部分。@hellokc很高兴它有帮助。。。请随意接受这个答案,除非你坚持要更多的答案。