Javascript 使用对象表示法向对象添加方法

Javascript 使用对象表示法向对象添加方法,javascript,prototype,meteor,javascript-objects,Javascript,Prototype,Meteor,Javascript Objects,我有以下代码: Template.leaderboard.players = function() { return Players.find({}, {sort: {score: -1, name: 1}}); }; Template.leaderboard.selected_name = function() { var player = Players.findOne(Session.get("selected_player")); return player &

我有以下代码:

Template.leaderboard.players = function() {
    return Players.find({}, {sort: {score: -1, name: 1}});
};

Template.leaderboard.selected_name = function() {
    var player = Players.findOne(Session.get("selected_player"));
    return player && player.name;
};
我想更清楚地这样组织:

Template.leaderboard = {
    players: function() {
        return Players.find({}, {sort: {score: -1, name: 1}});
    },
    selected_name: function() {
        var player = Players.findOne(Session.get("selected_player"));
        return player && player.name;
    }
};
问题是(我相信控制台中的错误)这会覆盖
Template.leadboard
对象的所有现有方法并替换它


是否有可能在使用上述符号保留现有方法的同时将这些方法添加到对象中?

您可以像在第一个示例中那样一次添加一个方法,也可以使用将对象与另一个对象合并的方法,例如jQuery的
。extend

$.extend(Template.leaderboard, {
    newMethod1: function() {
        ...
    },
    newMethod2: function() {
        ...
    }
});
使用后一种方法,您还需要首先确保
Template.leadboard
确实存在

var Template = Template || {};
Template.leaderboard = Template.leaderboard || {};

如果模板实际上是跨多个JS文件定义的,并且允许您不断添加方法,而不考虑实际加载文件的顺序,那么上述代码将是典型的


这里有一篇文章回答了这个问题,没有使用jquery或任何其他库

function merge_options(obj1,obj2){
    var obj3 = {};
    for (var attrname in obj1) { obj3[attrname] = obj1[attrname]; }
    for (var attrname in obj2) { obj3[attrname] = obj2[attrname]; }
    return obj3;
}
资料来源: ()

就你而言:

var newObject = {};

var tempObject = {
    players: function() {
        return Players.find({}, {sort: {score: -1, name: 1}});
    },
    selected_name: function() {
        var player = Players.findOne(Session.get("selected_player"));
        return player && player.name;
    }
};

for (var attrname in Template.leaderboard) {
    newObject[attrname] = Template.leaderboard[attrname];
}

for (var attrname in tempObject) {
    newObject[attrname] = tempObject[attrname];
}

Template.leaderboard = newObject;

我想你可以用原型来做实验that@TomSarduy这看起来像一个名称空间,对我来说不是一个“OO”对象。啊,我确实想知道Meteor是否有自己的“.extend”等价物,但找不到它。完美。很高兴知道没有javascript构造来完成这项工作。
var newObject = {};

var tempObject = {
    players: function() {
        return Players.find({}, {sort: {score: -1, name: 1}});
    },
    selected_name: function() {
        var player = Players.findOne(Session.get("selected_player"));
        return player && player.name;
    }
};

for (var attrname in Template.leaderboard) {
    newObject[attrname] = Template.leaderboard[attrname];
}

for (var attrname in tempObject) {
    newObject[attrname] = tempObject[attrname];
}

Template.leaderboard = newObject;