【问题标题】:javascript eager assignmentjavascript急切分配
【发布时间】:2011-07-08 11:14:33
【问题描述】:

受 jQuery 的影响,我正在尝试使用 javascript 中的方法链接。我围绕一个数组构建了一个包装器,它将接受坐标点和变换方法。它的一般语法是这样的:

myPath = new Path().move({x:50,y:50}).line({x:20,y:20}).rotate(Math.PI/3);

它工作得很好,而且它比一串坐标更具可读性。但是现在我希望能够通过串联来复制现有路径 颠倒的自己:

// create a symmetrical path.
myPath = new Path().move().line().etc().etc.concat(myPath.reverse());

但这失败了,因为 myPath 作为 concat 的参数是未知的。当我这样做时它会起作用:

var myPath = new Path();
myPath.move().line().etc().etc().concat(myPath.reverse());

但我想知道是否有比上述更短的构造来立即将新对象分配给变量定义? 如果它在 Javascript 中是不可能的,我会对它是否可能在其他语言中感兴趣?

问候, 杰罗恩。

【问题讨论】:

  • 您可以定义concat 方法,以便它允许字符串参数。例如,.concat('reverse')
  • 我不喜欢代码var myPath = new Path(); myPath.move().line().etc().etc().concat(myPath.reverse());。它的丑陋在于它的结果取决于评估顺序,即myPath.move().line().etc().etc()myPath.reverse() 中的哪一个被更早地评估。根据这一点,您要么得到重复的路径,要么得到连接(反向)空路径。我假设规范定义了哪个是正确的,但对于人类读者来说,代码是模棱两可的,因此是邪恶的。
  • 顺便说一下,做 myPath.move()、.reverse()、.etc(),修改 myPath 本身,还是返回修改后的副本?
  • @xofon 感谢您的反馈,我现在将开始以 1:1 的比例计算对这种方法的正面和负面反应(+1 是我的老板 :-)。方法链从左到右评估代码,基本上与我的目标受众阅读的方向相同。所有方法都返回修改后的自我(命令式)。然而,有些方法也接受路径作为参数,在这种情况下会返回修改后的副本。
  • 我不明白的另一件事是.reverse()的作用。特别是,如果语义是tmpPath = new Path().move().line().etc(); newPath = tmpPath.concat(tmpPath.reverse());,您会得到连接在 reversed tmpPath 上的反向 tmpPath,不是吗?

标签: javascript variable-assignment


【解决方案1】:
Path.prototype.concat = function () {
    this.concatting = true;
    return this;    
};

Path.prototype.reverse = function () {
    if (this.concatting) {
        Array.push.apply(
            this.pathArr,
            Array.slice(this.pathAr).reverse()
        );
        this.concatting = false;
    } else {
        this.pathAr.reverse();
    }

    return this;
};

var myPath = new Path().move().line().etc().concat().reverse();

不是很优雅,但是给你。

但我想知道是否有构造 其他且比上述短 立即将新对象分配给 变量定义?

不,您不能引用尚未创建的内容。


你也可以这样做:

(myPath = new Path()).move().line().etc().etc.concat(myPath.reverse());

【讨论】:

  • 感谢您的想法和(myPath = new Path()) 我要去调查!
【解决方案2】:

您可以按照以下方式编写duplicate 方法

Path.prototype.duplicate = function () {
    var clone = this.clone().reverse();
    this.concat(clone);
    return this;
}

然后调用`var myPath = new Path().move().line().etc().duplicate()。

【讨论】:

    猜你喜欢
    • 2019-02-01
    • 1970-01-01
    • 2017-12-27
    • 2021-09-10
    • 2013-05-29
    • 2011-05-23
    • 2021-09-29
    • 2011-04-02
    • 2023-04-03
    相关资源
    最近更新 更多