Javascript нетерпеливое назначение - PullRequest
2 голосов
/ 08 июля 2011

Под влиянием 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, мне было бы интересно, если это возможно на других языках?

С уважением, Jeroen.

Ответы [ 2 ]

2 голосов
/ 08 июля 2011
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());
1 голос
/ 08 июля 2011

Вы можете закодировать метод duplicate вдоль строк

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

, а затем вызвать `var myPath = new Path (). Move (). Line (). Etc (). Duplicate ().

...