【问题标题】:$.extend copy attributes of functional constructor$.extend 函数构造函数的复制属性
【发布时间】:2015-05-11 20:21:58
【问题描述】:

我们使用函数式构造器(Douglas Crockford 的函数式继承模式)并且只复制属性来验证它们。代码是这样的。

    var test= function(TestSpec){
        var thattest = {};

        thattest.begindate = TestSpec.begindate;
        thattest.getBegindate = function(){
            return thattest.begindate;
        };

        return  thattest;
    }

//这是我最初尝试复制的属性

        var copy = $.extend(true, {}, test )
        console.log(copy);
        _.each(copy, function(c) {
            console.log('[' + c + ']');
        });

如何只复制属性?我正在寻找一种使用功能样式将属性复制到另一个对象的方法。 如果需要,我们可以使用 underscore.js 或 lodash。

【问题讨论】:

  • 定义“属性”。您是指不引用函数的属性吗?
  • 不清楚您要达到的目标。特别是$.extend(true, {}, test) 看起来并没有什么特别的意义。
  • 几分钟前我问过它:-) 我们只复制属性而不是函数。代码到处重复,我们有很多函数式构造函数。
  • @Roamer 我一直在尝试使用 JQuery,因为我正在寻找一种简洁的方式来做到这一点。我还想尝试使用下划线或 lodash 的功能样式。
  • 还是不清楚。 “函数式构造函数”是什么意思?你想用/对它们做什么?

标签: jquery underscore.js lodash


【解决方案1】:

如果您的目标是仅复制不引用函数的属性,那么使用您自己的递归函数相当简单:

function copyAttributes(src) {
    var dest = {};
    Object.keys(src).forEach(function(key) {
        var value = src[key];
        switch (typeof value) {
            case "function":
                break;
            case "object":
                dest[key] = copyAttributes(value);
                break;
            default:
                dest[key] = value;
                break;
        }
    });
    return dest;
}

用法:

var copy = copyAttributes(test);

您可能希望在上面的"object" 案例中做一些更智能的事情来克隆内置类型(数组、DateRegExp 等)。您可以在jQuery.type(value)switch,这会为您提供更多信息。

【讨论】:

  • 强大的 underscore.js 或 lodash 怎么样?
  • @MohanRadhakrishnan:嗯,你在 API 文档中看到了什么吗?
  • console.log(_.functions(object));我想我可以使用它排除功能。但是 console.log(_.functions(test));不工作。
猜你喜欢
  • 2013-10-13
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
  • 2022-12-16
  • 2016-01-12
相关资源
最近更新 更多