替换对象';使用JavaScript中另一个对象的属性创建属性,而不使用库
我一直在使用jQuery.extend来替换如下的默认属性替换对象';使用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
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"
}
});
参考资料:
- 或者你可以使用