我在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;
};
答案 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();
};
答案 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中使用。