Наследование классов Javascript - PullRequest
3 голосов
/ 29 сентября 2011

Я пытаюсь научиться работать с 'классами' в javascript.

Вот мой код:

function Shape(x, y) {
    this.x= x;
    this.y= y;    
}

Shape.prototype.toString= function() {
        return 'Shape at '+this.x+', '+this.y;
    };

function Circle(x, y, r) {
    Shape.call(this, x, y); // invoke the base class's constructor function to take co-ords
    this.r= r;
}
Circle.prototype= $.extend(true, {}, Shape.prototype);

Circle.prototype.toString= function() {
    return 'Circular '+Shape.prototype.toString.call(this)+' with radius '+this.r;
}

var c = new Circle(1,2,3);
alert(c);

Есть ли способ определить функцию toString Shape внутри ееконструктор, или это не имеет смысла в этой ситуации?

1 Ответ

0 голосов
/ 29 сентября 2011

Исходя из моего понимания:

  1. Когда вы перемещаете .toString () в конструктор , тогда .toString () становится явным членом вашегопример.следовательно, любой вызов .toString () вызовет этот явный член.

Пример: http://jsfiddle.net/paptamas/qDSkj/

  1. Но когда вы определите это как прототип, (при отсутствииявного члена с именем .toString ()), любой вызов метода .toString () вызовет функцию .toString (), определенную для типа вызывающего объекта (в вашем случае Circle).

Пример: http://jsfiddle.net/paptamas/cbnLB/

Другими словами, явные члены имеют приоритет над определениями прототипа, и когда вы говорите

this.toString = function() ...

, вы определяете эту функцию как член вашего экземпляра (в отличие отчлену вашего типа - который также не оптимизирован).

С уважением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...