简体   繁体   中英

Object literal reusable function

Please find the below code for more information.

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

console.log(person.greet());

How can I make above object literal function greet() dymanic? Like I can pass params values for example person.greet('jessie','jay') will return hello jessie jay

Is it better to use constructor method (instances) in order to make function dynamic and reusable? I found that object literal is just to organize code.

I'll suggest you to use Constructor function. This pattern is called as Factory pattern . The function here acts as class and for each person a new object can be created.

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

First, you should think about what person and greet actually is or should be. If person is an object and greet a method that operates on the data of that object, the way you've written person is fine.

If you consider person to be some kind of namespace or module you will use to organize your code, you will write greet as a pure function that doesn't depend on and modify any variables out of its scope. In this case you won't have person instance data as firstname and lastname on person .

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

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

A combination of both will be very confusing in this case

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...

The question if you should use a constructor function is more about performance or if you need features like prototypal inheritance.

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

if you also want to update firstname and lastname

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM