Class static - garevna/js-course GitHub Wiki
| ⏪ |
|---|
Статические методы класса объявляются с помощью ключевого слова static
Эти методы могут быть вызваны только как методы класса
this указывает на конструктор класса, а не на экземпляр
class Canvas {
constructor () {
this.canvas = document.createElement ( 'canvas' )
document.body.appendChild ( this.canvas )
Canvas.resizeCanvas.call ( this.canvas )
this.canvas.style.border = "1px solid #000000"
this.area = this.canvas.getContext ( "2d" )
}
static resizeCanvas ( event ) {
this.width = window.innerWidth - 30
this.height = window.innerHeight - 20
}
static drawLine ( context, points ) {
context.area.moveTo( points[0].x, points[0].y )
context.area.lineTo( points[1].x, points[1].y )
context.area.stroke()
}
}
let pict = new Canvas ()
window.onresize = Canvas.resizeCanvas.bind ( pict.canvas )
Canvas.drawLine ( pict, [ { x: 50, y: 50 }, { x: 250, y: 250 } ] )
Canvas.drawLine ( pict, [ { x: 250, y: 250 }, { x: 100, y: 250 } ] )✋ Обратите внимание, что статические методы resizeCanvas и drawLine
вызываются как методы класса Canvas:
Canvas.resizeCanvas
Canvas.drawLine✋ Внутри конструктора this указывает на экземпляр
В этом примере для того, чтобы внутри метода this указывал на объект canvas экземпляра,
вызов метода resizeCanvas из конструктора происходит с передачей контекста:
Canvas.resizeCanvas.call ( this.canvas )и когда этот метод используется в качестве обработчика события resize объекта window,
то выполняется явная привязка контекста:
window.onresize = Canvas.resizeCanvas.bind ( pict.canvas )При вызове статического метода drawLine первым аргументом ему передается контекст вызова
✍ Примечание:
В данном случае объявление метода drawLine как статического
создает ненужные сложности с передачей контекста,
и гораздо проще объявить его так:
drawLine ( points ) {
this.area.moveTo( points[0].x, points[0].y )
this.area.lineTo( points[1].x, points[1].y )
this.area.stroke()
}чтобы контекстом вызова был экземпляр, создаваемый конструктором
| ⏪ |
|---|
class Canvas {
constructor () {
this.canvas = document.createElement ( 'canvas' )
document.body.appendChild ( this.canvas )
Canvas.resizeCanvas ()
}
static resizeCanvas ( event ) {
console.log ( `name: "${this.name}"` )
}
}
var pict = new Canvas ()
window.onresize = Canvas.resizeCanvasКогда метод resizeCanvas() будет вызван из конструктора, он выведет в консоль:
name: "Canvas"
Измените размер окна браузера
Теперь метод resizeCanvas() будет вызван в глобальной области видимости,
и в консоль будет выведено:
name: ""
поскольку this внутри resizeCanvas() теперь указывает
на глобальный объект ( window )
| ⏪ |
|---|