NodeJS의 JavaScript OOP : 어떻게?


Answers

Node.js 커뮤니티가 JavaScript ECMA-262 사양의 새로운 기능을 적시에 Node.js 개발자에게 제공하도록 보장합니다.

JavaScript 클래스를 살펴볼 수 있습니다. JS 클래스 에 대한 MDN 링크 ECMAScript 6 JavaScript 클래스가 도입 된이 메서드는 Javascript에서 OOP 개념을 모델링하는보다 쉬운 방법을 제공합니다.

참고 : JS 클래스는 엄격 모드 에서만 작동 합니다 .

다음은 Node.js로 작성된 상속 클래스의 일부입니다 (Used Node.js Version v5.0.0 ).

클래스 선언 :

'use strict'; 
class Animal{

 constructor(name){
    this.name = name ;
 }

 print(){
    console.log('Name is :'+ this.name);
 }
}

var a1 = new Animal('Dog');

상속 :

'use strict';
class Base{

 constructor(){
 }
 // methods definitions go here
}

class Child extends Base{
 // methods definitions go here
 print(){ 
 }
}

var childObj = new Child();
Question

나는 자바처럼 고전 OOP에 익숙하다.

NodeJS를 사용하여 JavaScript에서 OOP를 수행하는 가장 좋은 방법은 무엇입니까?

각 클래스는 module.export 가있는 파일입니까?

수업을 만드는 방법?

this.Class = function() {
    //constructor?
    var privateField = ""
    this.publicField = ""
    var privateMethod = function() {}
    this.publicMethod = function() {} 
}

대 (나는 그것이 맞는지조차 확신하지 못한다)

this.Class = {
    privateField: ""
    , privateMethod: function() {}

    , return {
        publicField: ""
        publicMethod: function() {}
    }
}

this.Class = function() {}

this.Class.prototype.method = function(){}

...

상속은 어떻게 될까요?

NodeJS에 OOP를 구현하기위한 특정 모듈이 있습니까?

나는 OOP를 닮은 것을 창조하는 천 가지의 다른 방법을 찾고있다. 그러나 나는 가장 실용적이고 / 깨끗한 방법이 무엇인지 전혀 모른다.

보너스 질문 : MongooseJS에 사용할 제안 된 "OOP 스타일"은 무엇입니까? (MongooseJS 문서를 클래스 및 인스턴스로 사용되는 모델로 볼 수 있습니까?)

편집하다

여기 JsFiddle 의 예가 피드백을 제공해주세요.

//http://javascriptissexy.com/oop-in-javascript-what-you-need-to-know/
function inheritPrototype(childObject, parentObject) {
    var copyOfParent = Object.create(parentObject.prototype)
    copyOfParent.constructor = childObject
    childObject.prototype = copyOfParent
}

//example
function Canvas (id) {
    this.id = id
    this.shapes = {} //instead of array?
    console.log("Canvas constructor called "+id)
}
Canvas.prototype = {
    constructor: Canvas
    , getId: function() {
        return this.id
    }
    , getShape: function(shapeId) {
        return this.shapes[shapeId]
    }
    , getShapes: function() {
        return this.shapes
    }
    , addShape: function (shape)  {
        this.shapes[shape.getId()] = shape
    }
    , removeShape: function (shapeId)  {
        var shape = this.shapes[shapeId]
        if (shape)
            delete this.shapes[shapeId]
        return shape
    }
}

function Shape(id) {
    this.id = id
    this.size = { width: 0, height: 0 }
    console.log("Shape constructor called "+id)
}
Shape.prototype = {
    constructor: Shape
    , getId: function() {
        return this.id
    }
    , getSize: function() {
        return this.size
    }
    , setSize: function (size)  {
        this.size = size
    }
}

//inheritance
function Square(id, otherSuff) {
    Shape.call(this, id) //same as Shape.prototype.constructor.apply( this, arguments ); ?
    this.stuff = otherSuff
    console.log("Square constructor called "+id)
}
inheritPrototype(Square, Shape)
Square.prototype.getSize = function() { //override
    return this.size.width
}

function ComplexShape(id) {
    Shape.call(this, id)
    this.frame = null
    console.log("ComplexShape constructor called "+id)
}
inheritPrototype(ComplexShape, Shape)
ComplexShape.prototype.getFrame = function() {
    return this.frame
}
ComplexShape.prototype.setFrame = function(frame) {
    this.frame = frame
}

function Frame(id) {
    this.id = id
    this.length = 0
}
Frame.prototype = {
    constructor: Frame
    , getId: function() {
        return this.id
    }
    , getLength: function() {
        return this.length
    }
    , setLength: function (length)  {
        this.length = length
    }
}

/////run
var aCanvas = new Canvas("c1")
var anotherCanvas = new Canvas("c2")
console.log("aCanvas: "+ aCanvas.getId())

var aSquare = new Square("s1", {})
aSquare.setSize({ width: 100, height: 100})
console.log("square overridden size: "+aSquare.getSize())

var aComplexShape = new ComplexShape("supercomplex")
var aFrame = new Frame("f1")
aComplexShape.setFrame(aFrame)
console.log(aComplexShape.getFrame())

aCanvas.addShape(aSquare)
aCanvas.addShape(aComplexShape)
console.log("Shapes in aCanvas: "+Object.keys(aCanvas.getShapes()).length)

anotherCanvas.addShape(aCanvas.removeShape("supercomplex"))
console.log("Shapes in aCanvas: "+Object.keys(aCanvas.getShapes()).length)
console.log("Shapes in anotherCanvas: "+Object.keys(anotherCanvas.getShapes()).length)

console.log(aSquare instanceof Shape)
console.log(aComplexShape instanceof Shape)



이것은 인터넷상의 객체 지향 자바 스크립트에 관한 최고의 비디오입니다 :

객체 지향 JavaScript에 대한 확실한 안내서

처음부터 끝까지 시계 !!

기본적으로 Javascript는 Java, C ++, C # 및 기타 인기있는 클래스의 클래스와 완전히 다른 Prototype-based 언어입니다. 비디오는 핵심 개념을 모든 대답보다 훨씬 잘 설명합니다.

ES6 (2015 출시)를 통해 우리는 Java, C ++, C #, Swift 등과 같이 자바 클래스 "클래스"를 사용할 수있는 "클래스"키워드를 얻었습니다.

Javascript 클래스 / 하위 클래스를 작성하고 인스턴스화하는 방법을 보여주는 비디오의 스크린 샷 : Prototype-based




Links