如何编写面向对象的Node.js模型

时间:2014-03-25 04:10:05

标签: javascript node.js oop

我在Node.js中编写面向对象的Cat类时遇到了很多麻烦。如何编写Cat.js类并按以下方式使用它:

// following 10 lines of code is in another file "app.js" that is outside 
// the folder "model"
var Cat = require('./model/Cat.js');

var cat1 = new Cat(12, 'Tom');
cat1.setAge(100);
console.log(cat1.getAge()); // prints out 100 to console

var cat2 = new Cat(100, 'Jerry');
console.log(cat1.equals(cat2)); // prints out false

var sameAsCat1 = new Cat(100, 'Tom');
console.log(cat1.equals(sameAsCat1)); // prints out True

您如何修复我写过的以下Cat.js课程:

 var Cat = function() {
    this.fields = {
        age: null,
        name: null
    };

    this.fill = function (newFields) {
        for(var field in this.fields) {
            if(this.fields[field] !== 'undefined') {
                this.fields[field] = newFields[field];
            }
        }
    };

    this.getAge = function() {
        return this.fields['age'];
    };

    this.getName = function() {
        return this.fields['name'];
    };

    this.setAge = function(newAge) {
        this.fields['age'] = newAge;
    };

    this.equals = function(otherCat) {
        if (this.fields['age'] === otherCat.getAge() && 
            this.fields['name'] === otherCat.getName())  {
            return true;
        } else {
            return false;
        }
    };
};

module.exports = function(newFields) {
    var instance = new Cat();
    instance.fill(newFields);
    return instance;
};

4 个答案:

答案 0 :(得分:6)

如果我要设计一个像这样的对象,那么我会这样做

function Cat(age, name) {       // Accept name and age in the constructor
    this.name = name || null;
    this.age  = age  || null;
}

Cat.prototype.getAge = function() {
    return this.age;
}

Cat.prototype.setAge = function(age) {
    this.age = age;
}

Cat.prototype.getName = function() {
    return this.name;
}

Cat.prototype.setName = function(name) {
    this.name = name;
}

Cat.prototype.equals = function(otherCat) {
    return otherCat.getName() == this.getName()
        && otherCat.getAge() == this.getAge();
}

Cat.prototype.fill = function(newFields) {
    for (var field in newFields) {
        if (this.hasOwnProperty(field) && newFields.hasOwnProperty(field)) {
            if (this[field] !== 'undefined') {
                this[field] = newFields[field];
            }
        }
    }
};

module.exports = Cat;     // Export the Cat function as it is

然后可以像这样使用

var Cat = require("./Cat.js");

var cat1 = new Cat(12, 'Tom');
cat1.setAge(100);
console.log(cat1.getAge());                 // 100

var cat2 = new Cat(100, 'Jerry');
console.log(cat1.equals(cat2));             // false

var sameAsCat1 = new Cat(100, 'Tom');
console.log(cat1.equals(sameAsCat1));       // true

var sameAsCat2 = new Cat();
console.log(cat2.equals(sameAsCat2));       // false

sameAsCat2.fill({name: "Jerry", age: 100});
console.log(cat2.equals(sameAsCat2));       // true

答案 1 :(得分:0)

此代码在这里运行良好的Person.js代码

  exports.person=function(age,name)
    {
        age=age;
        name=name;
        this.setAge=function(agedata)
        {
           age=agedata;
        }
        this.getAge=function()
        {
            return age;
        }
        this.setName=function(name)
        {
            name=name;
        }
        this.getName=function()
        {
            return name;
        }

};

调用对象代码:

var test=require('./route/person.js');
var person=test.person;
var data=new person(12,'murugan');
data.setAge(13);
console.log(data.getAge());
data.setName('murugan');
console.log(data.getName());

答案 2 :(得分:0)

@thefourtheye的答案中有错误循环漏洞,我将在下面进行描述

对象建模规则

  • 创建一个空的新对象

  • 创建填充的对象

  • 仅初始对象应由机器/代码设置

  • 初始分配对象后,对象中的任何更改都应仅通过用户交互来发生。

  • 初始对象分配后,在没有用户意图的情况下,通过代码对对象进行的任何更改都会添加一些错误

问题用例:

例如-因此,当您创建填充的对象时,如果任何属性(某日期)不具有任何值,则由于下面的代码,默认值被分配给它(某日期),这违反了对象建模规则。 / p>

  • 错误
  • 构造函数被赋予双重职责以创建新函数 和填充对象,他在创建填充对象时将其混合,并且 它会犯错误。
  • 意味着您的应用中存在一些错误代码,这些代码将自行设置值而无需用户干预

    this.logButton = React.createRef(); ref={this.logButton}

  

因此,为了解决此问题,我使用了以下JavaScript数据模型。

因此,它允许用户仅在需要其中任何一个且彼此不打扰时才有意创建填充的对象或新对象

focus = e => {
    this.logButton.current.openPopup();
};

  • 注意:
  • 构造函数仅用于创建新对象
  • InitModel 仅用于创建填充的对象

注意在投反对票之前,请在评论中添加您的疑问

答案 3 :(得分:-3)

我会使用TypeScript:

class Cat{
    fields = {
        age: null,
        name: null
    };

    fill(newFields) {
        for(var field in this.fields) {
            if(this.fields[field] !== 'undefined') {
                this.fields[field] = newFields[field];
            }
        }
    }

    getAge() {
        return this.fields.age;
    }

    setAge(newAge:number) {
        this.fields.age = newAge;
    }
}

export = Cat;

You can see the javascript it generates.

TypeScript可以在NodeJS和Browser中使用。