只需使用settings.closeButton.text
可以使用以下两种方法之一访问 JavaScript 属性:
点符号
访问属性的最常见和基本的方法 - 但是非法变量名(保留字除外 - 它们在 ES5 下被允许作为属性名)将不起作用。
foo.bar; // OK
foo.class; // only in ES5 and up
foo.&^&%^&@&(@&&@; // SyntaxError: yeah, it doesn't work
方括号符号
使用方括号表示法时,它可以接受任何内容 - 但是它将被转换为字符串(JavaScript 中的所有对象属性都是字符串):
// both are the same
foo['bar'];
foo["bar"];
// this is fine
foo['&^&%^&@&(@&&@'];
// this is equivalent to foo["[object Object]"]
foo[{}];
选择你喜欢的 - 但除非你需要,否则使用点符号来访问 JavaScript 对象属性很可能更容易。
编辑:关于你的 jsFiddle,这就是它不起作用的原因:
var options = {
// Passing these options in
msg: 'This is my message',
closeButton: {
text: "Close this",
colour: "red"
}
},
// These are the defaults if none are passed in
settings = $.extend({
title: 'Default Title',
msg: 'Default message',
closeButton: {
text: "Close",
colour: "red",
btnClass: "pull-right"
}
}, options);
console.log(settings.closeButton.text);
console.log(settings.closeButton.colour);
console.log(settings.closeButton.btnClass);
/*
settings.closeButton.text
settings.closeButton.colour
settings.closeButton.btnClass
*/
当您调用$.extend()
时,后面参数中的任何属性都将替换早期参数中的属性。在这种情况下,closeButton
您调用中的属性将$.extend()
被替换为 in options
,因为参数是稍后给出的。
这是一个实际的例子:
var a = { foo: 'bar' };
var b = { foo: 'baz' };
var c = $.extend(a, b);
var d = $.extend(b, a);
console.log(c.foo); // baz (b was last argument)
console.log(d.foo); // bar (a was given last)
要解决这个问题,要么交换参数,要么(在这种情况下可以接受)执行深层复制,方法是在参数前面加上true
:
$.extend({ a: { b: 1, c: 2 } }, { a: { b: 3 } }).a; // { b: 3 }
$.extend(true, { a: { b: 1, c: 2 } }, { a: { b: 3 } }).a; // { b: 3, c: 2 }