2010-12-14 2 views
1

Какое из следующих двух способов лучше назвать свойство Color и почему? Или это имеет значение?надлежащее использование javascript для «this»

lineSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7}, 

ИЛИ

lineSymbolizer:{strokeColor: LatLongLines.Color, strokeWidth: 2, strokeOpacity: 0.7}, 

Контекст КОД:

var LatLongLines = { 
    Graticule: null, 
    Color: "#000000", 
    Show: function() { 
     this.Graticule.activate(); 
    }, 
    Hide: function() { 
     this.Graticule.deactivate() 
    }, 
    Initialize: function() { 
     this.Graticule = new OpenLayers.Control.Graticule({ 
      numPoints: 2, 
      labelled: true, 
      lineSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7}, 
      labelSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7} 
     }); 

     map.addControl(this.Graticule); 
    } 
}; 

ответ

1

Лично я бы, вероятно, придерживаться this.Color. Если вы это сделаете, тогда все будет работать, если вы когда-нибудь захотите клонировать объект «LatLongLines».

Тао this довольно вовлечен, но в этом случае это будет контекстный объект, связанный с вызовом функции «через» ссылку «LatLongLines». Если эти функции могут блуждать от исходного объекта, необходимо предпринять шаги, чтобы сохранить память об объекте контекста, чтобы это было правильно при вызове, но это сложность, не очевидная ни в чем, что вы опубликовали.

+1

+1 Это, казалось бы, технически более эффективно, так как это прямая ссылка на объект. Использование его имени, по-видимому, потребует правильного поиска по каждому слою переменных и свойств области. Правильно ли это звучит? – user113716

+0

Ну да, я полагаю, это правда, @patrick dw. – Pointy

0

Этот код не работает, как вы ожидаете.

Ваш LatLongLines является простой задачей, но thisтолько работы по instances.

obj.method() 
    ^----- DOT determines the value of this inside the called function 
      If obj is an instance it will be used as 'this' otherwise 
      'this' will default to the global 'window' object 

Так как:

  • Вы избавляетесь от всех this и использовать LatLongLines вместо того, чтобы иметь один глобальный объект
  • Или вы создаете LatLongLines экземпляр, что путь this будет работать, вы можете (но вы знаете, что синглтон по-прежнему является глобальным государством, а глобальное состояние - злом)

Если вам необходимо создать новый экземпляр сделать что-то вдоль этих линий:

function LatLongLines() { 
    this.Graticule = null; 
    this.Color = "#000000"; 
}; 


// Let's use prototypical inheritance, these functions are shared between all 
// LatLongLines instances, of course the this always refers the specific instance that was called 
LatLongLines.prototype = { 
    Show: function() { 
     this.Graticule.activate(); 
    }, 

    Hide; function() { 
     this.Graticule.deactivate() 
    }, 

    Initialize: function() { 
     this.Graticule = new OpenLayers.Control.Graticule({ 
      numPoints: 2, 
      labelled: true, 
      lineSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7}, 
      labelSymbolizer:{strokeColor: this.Color, strokeWidth: 2, strokeOpacity: 0.7} 
     }); 

     // Maybe you want to pass map in? :) 
     map.addControl(this.Graticule); 
    } 
}; 

var someLines = new LatLongLines(); 
+0

Возможно, я вас недопонимаю, но я не уверен, что вы подразумеваете под * 'this', работает только с экземплярами *. Я имею в виду, я думаю, это правильно, но 'LatLongLines' * * ссылается на экземпляр. Это просто экземпляр простого «объекта». [Вот рабочий пример.] (Http://jsfiddle.net/patrick_dw/cpf7C/) Пожалуйста, дайте мне знать, если я полностью неверно истолковываю то, что вы имели в виду. – user113716

+0

обе произведение хорошо. this.Color и LatLongLines.Color. Мне просто интересно, что лучше. Или, если кто-то ошибается. – capdragon

+0

Извините, публикация права при возвращении от дантиста - плохая идея ... да, конечно, оба будут работать, я бы пошел с «LatLongLines», хотя, поскольку это единственный глобальный объект, и это сделало бы его более понятным , использование 'this' все еще подразумевает, что их может быть несколько. –

0

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

myObject = { 
    myFunction: function() { 
     console.log(this); // in FF or WebKit 
    } 
}; 

myObject.myFunction(); // this = myObject 

// Now we'll store a reference to our function and call 
// it without the dot notation. 
myFunc = myObject.myFunction; 

myFunc(); // this = window 

Я бы посоветовал использовать LatLongLines.Color, если вы не уверены в контексте this для обеспечения доступа к Color имущества LatlongLines.