Binding events in constructor
It feels like you have muddled the model, view, and controller. With a name like Person, I would expect this object to act as a model.  Constructing a person shouldn't also make its UI.  At the least, make the UI rendering a separate explicit step.

A second potential problem is that concatenating strings into HTML without escaping can lead to JavaScript injection vulnerabilities (also known as cross-site scripting).  I recommend using $.text() to fill in the text.



function Person(data) {
    this.name = data.name;
    this.age = data.age;
}

Person.prototype.speakName = function() {
    alert(this.name);
};

Person.prototype.speakAge = function() {
    alert(this.age);
};

Person.prototype.render = function($container) {
    var $element = $(
        '&lt;div class="person"&gt;&lt;p class="name"&gt;&lt;/p&gt;&lt;p class="age"&gt;&lt;/p&gt;&lt;/div&gt;'
    );

    // Fill text and bind events
    var self = this;
    $element.find('.name')
            .text(self.name)
            .click(function () {
                self.speakName();
             });

    $element.find('.age')
            .text(self.age)
            .click(function () {
                self.speakAge();
             });

    // render element
    $container.append($element);
};

//////////////////////////////////////////////////////////////////////

var persons = [
    new Person({
        name: 'Tom',
        age: 30
    }),
    new Person({
        name: 'Dick',
        age: 25
    }),
    new Person({
        name: 'Harry',
        age: 45
    })
];

for (var i = 0; i &lt; persons.length; i++) {
    persons[i].render($('#person-container'));
}
.person {
    border: 1px solid black;
    margin-bottom: 5px;
}
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"&gt;&lt;/script&gt;
&lt;div id="person-container"&gt;&lt;/div&gt;