javascript 塑造OOP代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了javascript 塑造OOP代码相关的知识,希望对你有一定的参考价值。

// OOP Classes
const MAX = 600;
let shapeCanvas = document.getElementById('shapeCanvas');
class Shape {
    constructor(x, y){
        this.div = document.createElement('div');
        this.div.classList.add('shape');
        this.div.style.left = `${x}px`;
        this.div.style.top = `${y}px`;
        shapeCanvas.appendChild(this.div);
       
    this.div.addEventListener('dblclick', () => {       // double click a shape to remove it from canvas
            this.div.remove();
        });
      

    this.div.addEventListener('click', () => {         // click a shape on canvas to send description to side panel
        
        this.describe();
    });
    
    }
}
class Rectangle extends Shape {
    constructor(x, y, width, height) {
        super(x, y);
        this.div.style.width = `${width}px`;
        this.div.style.height = `${height}px`;
        this.div.classList.add('rectangle');
    }
    describe() {
    
        let shapeName = document.getElementById('shapeName');
        shapeName.innerText = this.constructor.name;
        let shapeWidth = document.getElementById('shapeWidth');
        shapeWidth.innerText = this.div.style.width;
        let shapeHeight = document.getElementById('shapeHeight');
        shapeHeight.innerText = this.div.style.height;
        let shapeRadius = document.getElementById('shapeRadius');
        shapeRadius.innerText = 'N/A';
        let shapeArea = document.getElementById('shapeArea');
        let area = parseInt(this.div.style.height, 10) * parseInt(this.div.style.width, 10);
        shapeArea.innerText = `${area}px`;
        let perimeterText = parseInt(this.div.style.height, 10) * 2 + parseInt(this.div.style.width, 10) * 2;
        let shapePerimeter = document.getElementById('shapePerimeter');
        shapePerimeter.innerText = `${perimeterText}px`;
        
        
    }
}
class Square extends Shape {
    constructor(x, y, sideLength) {
        super(x, y);
        this.div.sideLength = sideLength;
        this.div.style.width = `${sideLength}px`;
        this.div.style.height = `${sideLength}px`;
        this.div.classList.add('square');
    }
    describe() {

        let shapeName = document.getElementById('shapeName');
        shapeName.innerText = this.constructor.name;
        let shapeWidth = document.getElementById('shapeWidth');
        shapeWidth.innerText = this.div.style.width;
        let shapeHeight = document.getElementById('shapeHeight');
        shapeHeight.innerText = this.div.style.height;
        let shapeRadius = document.getElementById('shapeRadius');
        shapeRadius.innerText = 'N/A';
        let squareArea = parseInt(this.div.style.height, 10) * parseInt(this.div.style.width, 10);
        let shapeArea = document.getElementById('shapeArea');
        shapeArea.innerText =`${squareArea}px`;
        let perimeterText = parseInt(this.div.style.width, 10) * 4;
        let shapePerimeter = document.getElementById('shapePerimeter');
        shapePerimeter.innerText = `${perimeterText}px`;
        
        
    }
}
class Circle extends Shape {
    constructor(x, y, radius) {
        super(x, y);
        this.div.radius = radius;
        this.div.style.height = `${radius}px`;
        this.div.style.width = `${radius}px`;
        this.div.classList.add('circle');
    }
    describe() {
        
        let shapeName = document.getElementById('shapeName');
        shapeName.innerText = this.constructor.name;
        let width = parseInt(this.div.radius, 10) * 2;
        let shapeWidth = document.getElementById('shapeWidth');
        shapeWidth.innerText = `${width}px`;
        let height = parseInt(this.div.radius, 10) * 2;
        let shapeHeight = document.getElementById('shapeHeight');
        shapeHeight.innerText = `${height}px`;
        let areaText = parseInt(this.div.radius, 10) * parseInt(this.div.radius, 10) * 3.14;
        let shapeArea = document.getElementById('shapeArea');
        shapeArea.innerText = `${areaText}px`;
        let perimeterText = parseInt(this.div.radius, 10) * 3.14 * 2;
        let shapePerimeter = document.getElementById('shapePerimeter');
        shapePerimeter.innerText = `${perimeterText}px`;
        let radius = parseInt(this.div.radius, 10);
        let shapeRadius = document.getElementById('shapeRadius');
        shapeRadius.innerText = `${radius}px`;
    
    }
}
class Triangle extends Shape {
    constructor(x, y, height) {
        super(x, y);

        this.div.style.width = 0;
        this.div.style.height = 0;
        this.div.style.borderBottom = `${height}px solid yellow`;
        this.div.style.borderLeft = `${height}px solid transparent`;
        this.div.classList.add('triangle');
    }
    describe() {
        
        let shapeName = document.getElementById('shapeName');
        shapeName.innerText = this.constructor.name;
        let shapeWidth = document.getElementById('shapeWidth');
        shapeWidth.innerText = 'N/A';
        let height = parseInt(this.div.style.borderBottom, 10) 
        let shapeHeight = document.getElementById('shapeHeight');
        shapeHeight.innerText = `${height}px`;
        let shapeRadius = document.getElementById('shapeRadius');
        shapeRadius.innerText = 'N/A';
        let areaText = parseInt(this.div.style.borderBottom, 10) * parseInt(this.div.style.borderLeft, 10) * 0.5;
        let shapeArea = document.getElementById('shapeArea');
        shapeArea.innerText = `${areaText}px`;
        let perimeterText = parseInt(this.div.style.borderLeft, 10) * 2  + Math.sqrt(2) * parseInt(this.div.style.borderLeft, 10);
        let shapePerimeter = document.getElementById('shapePerimeter');
        shapePerimeter.innerText = `${perimeterText}px`;
    
    }
}









// Buttons to generate to Canvas
// Rectangle button for Canvas
let rectangleBtn = document.getElementById('rectangleBtn');
rectangleBtn.addEventListener('click', insertRectangle);

function insertRectangle(event) {
    event.preventDefault();
    let width = document.getElementById('rectangleWidth').value;
    let height = document.getElementById('rectangleHeight').value;
    let xVal = randomVal(0,(MAX - width));
    let yVal = randomVal(0,(MAX - height));
    let rectangle = new Rectangle(xVal, yVal, width, height);
}
// Square button for Canvas
let squareBtn = document.getElementById('squareBtn');
squareBtn.addEventListener('click', insertSquare);

function insertSquare(event) {
    event.preventDefault();
    let sideLength = document.getElementById('squareLengths').value;
    let xVal = randomVal(0, (MAX - sideLength));
    let yVal = randomVal(0, (MAX - sideLength));
    let square = new Square(xVal, yVal, sideLength);
}
// Circle button for Canvas
let circleBtn = document.getElementById('circleBtn');
circleBtn.addEventListener('click', insertCircle);

function insertCircle(event) {
    event.preventDefault();
    let radius = document.getElementById('circleRadius').value;
    let xVal = randomVal(0, (MAX - radius));
    let yVal = randomVal(0, (MAX - radius));
    let circle = new Circle(xVal, yVal, radius);
}
// Triangle button for Canvas
let triangleBtn = document.getElementById('triangleBtn');
triangleBtn.addEventListener('click', insertTriangle);

function insertTriangle(event) {
    event.preventDefault();
    let height = document.getElementById('triangleHeight').value;
    let xVal = randomVal(0, (MAX - height));
    let yVal = randomVal(0, (MAX - height ));
    let triangle = new Triangle(xVal, yVal, height);
}





function randomVal(min, max) {
    return Math.floor(Math.random() * (max - min)) + min;
}



以上是关于javascript 塑造OOP代码的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 和 jQuery 中的 Java 式 OOP 失败

OOP in Javascript

在javascript中使用OOP启动和停止计时器[重复]

JavaScript OOP 之 this指向

转换ES6中的ES5 IIFE,OOP Javascript编程

javascript OOP w / Javascript