Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换对象';使用JavaScript中另一个对象的属性创建属性,而不使用库_Javascript_Object_Properties_Default_Extend - Fatal编程技术网

替换对象';使用JavaScript中另一个对象的属性创建属性,而不使用库

替换对象';使用JavaScript中另一个对象的属性创建属性,而不使用库,javascript,object,properties,default,extend,Javascript,Object,Properties,Default,Extend,我一直在使用jQuery.extend来替换如下的默认属性 var Car = function(options){ var defaultOptions = { color: "hotpink", seats: { material: "fur", color: "black", count: 4 }, wheels: 4 } this

我一直在使用jQuery.extend来替换如下的默认属性

var Car = function(options){
    var defaultOptions = {
        color: "hotpink",
        seats: {
            material: "fur",
            color: "black",
            count: 4
        },
        wheels: 4
    }
    this.options = $.extend(true,{},defaultOptions,options); 
}

var myCar = new Car({
    color: "blue",
    seats: {
        count: 2,
        material: "leather"
    }
});

alert(myCar.options.color); // "blue"
alert(myCar.options.seats.color); // "black"
alert(myCar.options.seats.count); // 2

虽然它非常有效,但我想知道在没有任何库的情况下实现类似结果的最佳方法。我只想在函数中定义一些默认设置,并用参数中的设置替换它们,如果每次这样做时都包含一个库,那就太过分了。

基本上,这只是一种递归使用。您可以看到jQuery实现的完整源代码(上的行号会随着时间的推移而腐烂,但很可能会保留在
core.js

这里有一个非常基本的即兴表演:

function deepCopy(src, dest) {
    var name,
        value,
        isArray,
        toString = Object.prototype.toString;

    // If no `dest`, create one
    if (!dest) {
        isArray = toString.call(src) === "[object Array]";
        if (isArray) {
            dest = [];
            dest.length = src.length;
        }
        else { // You could have lots of checks here for other types of objects
            dest = {};
        }
    }

    // Loop through the props
    for (name in src) {
        // If you don't want to copy inherited properties, add a `hasOwnProperty` check here
        // In our case, we only do that for arrays, but it depends on your needs
        if (!isArray || src.hasOwnProperty(name)) {
            value = src[name];
            if (typeof value === "object") {
                // Recurse
                value = deepCopy(value);
            }
            dest[name] = value;
        }
    }

    return dest;
}

您可以模仿jQuery的api“扩展”,就像上面所说的那样。我认为没有比这更好的办法了。因此,我认为jQuery的api是合适的。

在ES6中,它引入了扩展操作符

var Car = function(options){
    var defaultOptions = {
        color: "hotpink",
        seats: {
            material: "fur",
            color: "black",
            count: 4
        },
        wheels: 4
    }
    this.options = {...defaultOptions, ...this.options};
}

var myCar = new Car({
    color: "blue",
    seats: {
        count: 2,
        material: "leather"
    }
});
参考资料:

  • 或者你可以使用

如果OP想要保留API,那么jQuery是一个良好的开端,但是如果OP准备更改(简化)API,那么专门构建的扩展可以更短、更高效、更健壮(例如jQuery isPlainObject非常普通,没有必要,isFunction或isArray也没有)。RobG说,jQuery实现看起来像是相当多的代码。我想知道是否有任何解决方法或其他方法来解决这个问题。我正在尝试制作一个易于使用、独立的代码段,它基本上只是一个函数,其中包含一些方法。有点像jQuery插件,但不依赖jQuery。我想让用户在一个对象中定义所有选项,以便代码可读,但我想为所有内容定义默认值,这样,如果用户对默认外观和功能满意,就不需要更改任何内容。@user1463028:我刚才指的是jQuery,它是一个经过大量使用的相当彻底的版本。最基本的一点是,它只是对中的..的递归使用。我添加了一个非常基本的,但是为什么不使用经过彻底测试的东西呢?是的,理解和取消点击需要更多的时间,但是…:-)最好的,