В большинстве языков ООП «i» в методе экземпляра ссылается сначала на локальный, а затем на глобальный, но никогда не на переменную экземпляра или переменную класса? - PullRequest
0 голосов
/ 06 мая 2010

В следующем коде:

    <script type="text/javascript">

        var i = 10;

        function Circle(radius) {
            this.r = radius;
            this.i = radius;
        }

        Circle.i = 123;

        Circle.prototype.area = function() { alert(i); }

        var c = new Circle(1);
        var a = c.area();

    </script>

Что предупреждает? Ответ в конце этого вопроса.

Я обнаружил, что i в вызове оповещения относится либо к любой локальной (если есть), либо к глобальной переменной. Не может быть, чтобы это была переменная экземпляра или переменная класса, даже если нет локальной и глобальной переменной. Чтобы сослаться на переменную экземпляра i, нам нужно this.i, а на переменную класса i нам понадобится Circle.i. Это действительно так почти для всех объектно-ориентированных языков программирования? Любое исключение? Существуют ли случаи, когда, когда нет локального и глобального, он ищет переменную экземпляра, а затем область видимости переменной класса? (или в этом случае они называются областью действия?)

ответ: 10 оповещается.

Ответы [ 5 ]

1 голос
/ 06 мая 2010

Вот:

var i = 10;

function Circle(radius) {
            var i = radius || 0;
            this.r = i;
            this.i = radius;
            this.toString = function(){ return i; };
        }    
var nwCircle = new Circle(45);

alert(nwCircle.r); //=>45;
alert(nwCircle); //=>45 (toString found local i);
alert(i); //=>10

Теперь в конструкторе Circle вы создали замыкание для ( local, принадлежащего самому объекту ) переменной i. Глобально определенный i не затронут. Итак, в JavaScript это зависит от того, где вы определяете свою переменную. По крайней мере, в javascript поиск снизу вверх (от локальной области до глобальной области) выполняется для i, и используется первый найденный. Поэтому, если конструктор Circle не содержит переменную с именем i, будет использоваться глобальный i.

1 голос
/ 06 мая 2010

Для ссылки на переменную экземпляра вы должны использовать this.i. Circle.i относится к статическому свойству в конструкторе Circle - оно не повлияет на экземпляры Circle.

1 голос
/ 06 мая 2010

То, что вы видите, является закрытием.

http://www.jibbering.com/faq/faq_notes/closures.html

Если вы хотите this.i или Circle.i, вы должны явно обратиться к ним.

Как и в Python (self.x и cls.x), Javascript не имеет синтаксического сахара для атрибутов экземпляра или класса / прототипа.

0 голосов
/ 06 мая 2010

Нет, это не правда.

Большинство языков позволяют вам обращаться к переменным экземпляра, не используя что-то вроде this.i, чтобы указать, что это переменная экземпляра.

Языки, которые действительно являются объектно-ориентированными, такие как Java, C # и VB (7+), вообще не имеют глобальных переменных.

Javascript на самом деле не объектно-ориентированный язык, это процедурный язык с ограниченной поддержкой объектной ориентации. Так как у него нет классов, нет никакой области видимости класса, поэтому вам нужно использовать ключевое слово this, чтобы указать область объекта.

0 голосов
/ 06 мая 2010

в общем объектно-ориентированном языке программирования, переменная экземпляра (как указывает название) может быть доступна только через экземпляр класса (кроме статических переменных, которые могут быть доступны по имени класса). Поэтому, когда вы хотите сослаться на переменную экземпляра, вам нужен объект (экземпляр) класса.

...