Object对象

静态方法

Object.keys(),Object.getOwnPropertyNames()

可以用来遍历对象的属性

1
2
3
4
5
6
7
8
var obj1 = {
"name":"pxy",
"age":12
}
//undefined
Object.getOwnPropertyNames(obj1)

//(2) ["name", "age"]

实例方法

Object.protype上定义的方法就是实例方法,能够被Object的实例调用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Object.getOwnPropertyNames(Object.prototype)

(12) ["constructor", "__defineGetter__", "__defineSetter__", "hasOwnProperty", "__lookupGetter__", "__lookupSetter__", "isPrototypeOf", "propertyIsEnumerable", "toString", "valueOf", "__proto__", "toLocaleString"]
0: "constructor"
1: "__defineGetter__"
2: "__defineSetter__"
3: "hasOwnProperty"
4: "__lookupGetter__"
5: "__lookupSetter__"
6: "isPrototypeOf"
7: "propertyIsEnumerable"
8: "toString"
9: "valueOf"
10: "__proto__"
11: "toLocaleString"
length: 12
__proto__: Array(0)

这些方法是所有对象都公有的

valueOf

valueOf方法的作用是返回一个对象的“值”,默认情况下返回对象本身。

1
2
var obj = new Object();
obj.valueOf() === obj // true

但是这种情况除外:

1
2
var a = new Object(1)
a.valueOf() === a // false

valueOf方法的主要用途是,JavaScript 自动类型转换时会默认调用这个方法

1
2
3
var obj = new Object();
1 + obj
//"1[object Object]"

可以重写 valueOf 方法

1
2
3
4
5
obj.valueOf = function(){
return 2;
}
1+obj
//3

这个很好理解,因为obj查找 valueOf 函数,会先从自己的属性开始找,找不到就通过 __proto__ 找上层对象的valueOf 属性

编码风格

switch case 结构

不推荐如下的方式

1
2
3
4
5
6
7
8
9
10
11
12
function doAction(action) {
switch (action) {
case 'hack':
return 'hack';
case 'slash':
return 'slash';
case 'run':
return 'run';
default:
throw new Error('Invalid action.');
}
}

推荐使用对象的方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function doAction(action) {
var actions = {
'hack': function () {
return 'hack';
},
'slash': function () {
return 'slash';
},
'run': function () {
return 'run';
}
};

if (typeof actions[action] !== 'function') {
throw new Error('Invalid action.');
}

return actions[action]();
}

更加简洁