一、对象
对象的使用与属性
JS中所有的变量都可以当对象使用,除了两个例外null和undefined。
false.toString(); // 'false'
[1, 2, 3].toString(); // '1,2,3'
function Foo(){}
Foo.bar = 1;
Foo.bar; // 1
复制代码
数字的字面量不能当对象。
2.toString(); // 出错:SyntaxError
复制代码
对象作为数据类型,使用{}创建一个简单的对象,这个新创建的对象从Object.prototype继承下面,没有任何自定义属性。
var foo = {}; // 一个空对象
// 一个新对象,拥有一个值为12的自定义属性'test'
var bar = {test: 12};
复制代码
访问对象的属性
var foo = {name: 'kitten'}
foo.name; // kitten
foo['name']; // kitten
var get = 'name';
foo[get]; // kitten
foo.1234; // SyntaxError
foo['1234']; // works
复制代码
删除属性:删除属性唯一方法是delete操作符
var obj = {
bar: 1,
foo: 2,
baz: 3
};
obj.bar = undefined;
obj.foo = null;
delete obj.baz;
for(var i in obj) {
if (obj.hasOwnProperty(i)) {
console.log(i, '' + obj[i]);
}
}
输出bar undefined和foo null
复制代码
二、原型
判断一个对象是否包含自定义属性而不是原型链上的属性,我们需要使用继承自Object.prototype的hasOwnPrototype方法。
// 修改Object.prototype
Object.prototype.bar = 1;
var foo = {goo: undefined};
foo.bar; // 1
'bar' in foo; // true
foo.hasOwnProperty('bar'); // false
foo.hasOwnProperty('goo'); // true
复制代码
JS不会保护hasOwnProperty作为属性被非法占用,因此如果一个对象碰巧存在这个属性,就需要外部的hasOwnProperty函数来获取正确的结果。
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // 总是返回 false
// 使用其它对象的 hasOwnProperty,并将其上下文设置为foo
({}).hasOwnProperty.call(foo, 'bar'); // true
复制代码