当前位置: 首页 > 面试题库 >

NodeJS中的JavaScript OOP:如何?

施茂
2023-03-14
问题内容

我已经习惯了Java中的经典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)

问题答案:

这是一个开箱即用的示例。如果您想减少“ hacky”,则应使用继承库或类似的库。

在文件animal.js中,您应该编写:

var method = Animal.prototype;

function Animal(age) {
    this._age = age;
}

method.getAge = function() {
    return this._age;
};

module.exports = Animal;

要在其他文件中使用它:

var Animal = require("./animal.js");

var john = new Animal(3);

如果要“子类”,请在mouse.js中:

var _super = require("./animal.js").prototype,
    method = Mouse.prototype = Object.create( _super );

method.constructor = Mouse;

function Mouse() {
    _super.constructor.apply( this, arguments );
}
//Pointless override to show super calls
//note that for performance (e.g. inlining the below is impossible)
//you should do
//method.$getAge = _super.getAge;
//and then use this.$getAge() instead of super()
method.getAge = function() {
    return _super.getAge.call(this);
};

module.exports = Mouse;

您也可以考虑“方法借用”而不是垂直继承。您无需从“类”继承即可在其类上使用其方法。例如:

 var method = List.prototype;
 function List() {

 }

 method.add = Array.prototype.push;

 ...

 var a = new List();
 a.add(3);
 console.log(a[0]) //3;


 类似资料:
  • 问题内容: 我是Node.JS的新手。我发现很少有文章说我们可以使用.env文件来设置process.env变量,例如, 但是当我在节点中运行该程序时,它仍然是8080 PORT(默认情况下)。问题是,如何在没有任何其他第三方模块帮助的情况下在Node中设置env变量?(我发现管理第三方配置的第三方软件包很少,但是…有点困惑,不同的软件包可能具有不同的规则和更复杂的用例;我想从清晰的方法开始研究纯

  • 我有像下面这样的节点服务器。并且我几乎同时推送2个请求(使用相同的url=“localhost:8080/”)。我的问题是:“为什么服务器等待第一个请求处理完成,然后将处理第二个请求”? 我的测试控制台中的输出: (注意:第2行将在12second后显示)-server.js:

  • 这是我的JSON文件。我只是不知道如何将对象PAV-001中的这个随机字符串()与node.js中的PAV-002中的所有这类字符串进行比较。只是想知道他们是否平等。谢谢!

  • 在这里,我试图从mongodb集合中获取最新的记录键p_id值,但得到的错误如下:SyntaxError:await仅在异步函数中有效。那么如何解决这个问题呢? 数据控制器。js:

  • 已经有一个类似的线程,看起来很像,但这里我有一些不同的问题。 我想要完整的URL,其中URL是动态的。我所有的页面都使用一个通用的nunjuk模板。 让我们面对现实吧。假设我有一个URL路径: /blog/one/two/three 值得注意的是,“博客”是静态的,但“一”、“二”和“三”是变量,它们将根据我网站上请求的博客文章而改变。 我使用以下代码通过传递来获取URL:post“但是当我在UR

  • 问题内容: 是否可以在正在运行的nodejs脚本中侦听传入的击键?如果我使用并监听其事件,则输入将被缓冲到下一个换行符,如下所示: 运行此,我得到: 我想要看的是: 我正在寻找一个等效于例如ruby的nodejs 这可能吗? 问题答案: 如果切换到原始模式,则可以通过这种方式实现: