对象文字可重用函数

时间:2016-02-03 07:11:56

标签: javascript

请查看以下代码以获取更多信息。

var person = {
    firstname:"john",
    lastname:"doe",
    greet: function(){
        return "hello " + this.firstname + " " + this.lastname; 
    }
}

console.log(person.greet());

如何使上面的对象文字函数greet()动态?就像我可以传递params值例如person.greet('jessie','jay')将返回hello jessie jay

使用构造函数方法(实例)以使函数动态化和可重用是否更好?我发现object literal只是为了组织代码。

3 个答案:

答案 0 :(得分:5)

我建议您使用构造函数。此模式称为Factory pattern。此处的函数充当,并且可以为每个人创建新对象。

function Person(firstname, lastname) {
    this.firstname = firstname;
    this.lastname = lastname;
}

Person.prototype.greet = function () {
    return 'Hello ' + this.firstname + ' ' + this.lastname;
};

var jon = new Person('Jon', 'Skeet');
var tushar = new Person('Tushar', 'Jadhav');

console.log(jon.greet()); // Hello Jon Skeet
console.log(tushar.greet()); // Hello Tushar Jadhav

答案 1 :(得分:4)

首先,您应该考虑persongreet实际上或应该是什么。如果person是一个对象而greet是一个对该对象的数据进行操作的方法,那么您编写person的方式就可以了。

如果您认为person是用于组织代码的某种命名空间或模块,那么您将greet编写为一个不依赖和修改任何代码的纯函数变量超出其范围。在这种情况下,您不会将人员实例数据作为person上的名字和姓氏。

var person = {
    greet: function(person){
        return "hello " + person.firstName+ " " + person.lastName; 
    }
};  

var jenny = { firstName : 'Jennifer', lastName : 'IdowntKnow' };
person.greet(jenny);

在这种情况下,两者的结合会非常混乱

var person = {
    firstname:"john",
    lastname:"doe",
    greet: function(firstName, lastName){
        /* .. */
    }
};

person.greet('Jennifer', 'IdowntKnow');  
// hmm, what happens here? Person switched to Jennifer now? What about john? weird code...

您是否应该使用构造函数的问题更多的是关于性能还是需要原型继承等功能。

答案 2 :(得分:-2)

greet: function(fname, lname){
    return "hello " +fname + " " + lname; 
}

如果您还想更新名字和姓氏

greet: function(fname, lname){
    this.firstname =fname;
    this.latname =lname;
    return "hello " +fname + " " + lname; 
}