Някой знаели защо this така написано не работи?-Javascript


0

Здравейте колеги, опитвам се да си фиксна страните на един кръг;

По този начин работи:

    var Circle = (function () {


        function Circle(x, y, r) {
            Shapes.call(this, x, y);
            this._r = r;
        }

        Circle.prototype = new Shapes();

        Circle.prototype.drowShapes = function () {
            ctx.beginPath();
            ctx.arc(this.x, this.y, this._r, 0, 2 * Math.PI);
            ctx.stroke();
        };

       Circle.prototype.sideLeft = function (){
            return this.x + this._r;
        };
        Circle.prototype.sideRight = function (){
            return this.x + this._r;
        };
        Circle.prototype.sideTop = function(){
            return save.y - save._r;
        };
        Circle.prototype.sideBottum = function(){
             return this.y + this._r;
        };



        return Circle;
    }());

А по този не;

    var Circle = (function () {


        function Circle(x, y, r) {
            Shapes.call(this, x, y);
            this._r = r;
        }

        Circle.prototype = new Shapes();

        Circle.prototype.drowShapes = function () {
            ctx.beginPath();
            ctx.arc(this.x, this.y, this._r, 0, 2 * Math.PI);
            ctx.stroke();
        };


        Circle.prototype.sideCircle = function(){
            var x, y, r;
            x = this.x;
            y = this.y;
            r = this._r;

            var side = {
                left: x - r,
                right: x + r,
                top: y - r,
                bottum: y + r
            }
            return side

        };

        return Circle;
    }());

Някой можели да ми обясни защо?




Отговори



0
Нямали някой по напреднал който да знае защо не работи по втория начин?

от Dodko (165 точки)


0
 Мда. Това е кофти JavaScript проблем. Виж си втория ред на червения код. Там декларираш някакви променливи във функция. Най-вероятно this след това ти сочи към тях и това чупи логиката. Много трябва да внимаваш във всеки момент накъде сочи this. Мисля, че винаги се обърща към най-вътрешния scope. Ако там нямаш такива променливи, ги търси в следващия по-външн и т.н.

от ivan.mihov1 (4988 точки)


0
Сложи var _self=this и след това в червеното викай _self 



0

Пробвах и с self, пак не става!

На мен ми е странно, че като вкарам стойностите в обект вече ги няма.

 Circle.prototype.sideCircle = function(){
            var x, y, r;     
            x = this.x;
            y = this.y;           Тук съществува.
            r = this._r;

            var side = {
                left: x - r,
                right: x + r,               Тук вече ги няма.
                top: y - r,
                bottum: y + r
            }
            return side

        };


от Dodko (165 точки)


-1
С {} вече дефинираш нов "обект", затова в side нямаш x, y, r. Трябва отново да използваш this.x, this.y, this.r.



0

Колега, аз като го тествам на Node.js и на FF си работи...

Може ли да кажеш какво точно значи да не работи?


от DonchoMinkov (12706 точки)


0
Здравей Дончо, от долу съм дал малко по подробно описание.

от Dodko (165 точки)


0

Когато ползваш this, внимавай към кой контекст сочи той. this ти връща като контекст обекта/функцията, в който го използваш.





0

За да е по ясно какво правя вижте целия код тук, упражнявам ООП-то в javascript.

В анимацията се опитвам да индексирам страните на окръжността която се движи и при допир да сменя посоката.

Така сменям кейса за посоките и тук е грешката;

        if (ballForMuving.sideCircle.right === box.sideRight && ballForMuving.sideCircle.bottum === lineLeft.y){
            positionBal = key.right;
        }

        //Ball in side right
        if(ballForMuving.sideCircle.left === box.sideLeft && ballForMuving.sideCircle.bottum === lineRight.y ){
            positionBal = key.left;
        }  

в дебъгването ми показва ballForMuving.sideCircle.right = NAN. 

Ето как го бях направил отначало и резултата e тук.

Също така неми е ясно защо в работещия код, трябва всеки път да  правя update на страните на движещата се окръжност (направил съм го по ужасен начин в function muveRight, muveLeft). Нали circle.sideRight е референтен тип?

Колеги след като прегледате кода, ще съм ви много благодарен за всякакъв вид забележки!

(Обучавам се online, само не ме обиждайте)  :))

  

от Dodko (165 точки)


0

sideCirle до колкото гледам ти е функция, а ти го викаш като property... сиреч

ballForMuving.sideCircle.right  

трябва да стане

ballForMuving.sideCircle().right 


от paveld3 (17458 точки)

0
Като цяло тук всички са пропуснали много важен момент, а именно, че кода не е написан добре, отговарят ти локално при условие, че трябва просто нещата да се пренапишат и също така няма нужда да си носиш конструктурите и класовете от C# в JS, ползвай си обект литерал, много е модерно в момента да се изкривяват нещата и ефекта е на лице :). Тези, които са ти отговаряли явно и те толкова си и разбират от функционално програмиране. И за да е градивен коментара препоръчвам http://eloquentjavascript.net/, MDN и по - малко, телерик, софтакадеми JS (последните -> ползвай ги за практика и сертификатите, не ги попивай много). Нека никой не се обижда :)

от mutekiNo (0 точки)