CodeSky 代码之空

随手记录自己的学习过程

Javascript 上帝说,我的对象想要默认值

2015-02-24 16:26分类: JavaScript评论: 0

找了下貌似这一篇没写,于是乎坑出了可能是一个月前的代码mark。

我们来看以下两段

1		window.Option = {};
2
3		Option.defaultProps = function(obj, defaults) {
4			function isObject(obj) {
5				return Object.prototype.toString.call(obj) === '[object Object]';
6			}
7
8			if (!isObject(obj)) {
9				return defaults;
10			}
11
12			for (var key in defaults) {
13				if (!defaults.hasOwnProperty(key)) {
14					continue;
15				}
16
17				var objValues = obj[key];
18				var defaultValue = defaults[key];
19
20				if (isObject(objValues)) {
21					obj[key] = Option.defaultProps(objValues, defaultValue);
22				} else if (objValues === undefined) {
23					obj[key] = defaultValue;
24				}
25			}
26			return obj;
27		};
28
29		function People() {};
30
31		People.defaults = {
32			name: 'Hi',
33			job: 'Student',
34			age: 19,
35			friends: ['No One']
36		};
37
38		people1 = Option.defaultProps({
39			name: 'Sky',
40			age: 20
41		}, People.defaults);
42
43		people1.prototype = People.prototype;
44
45		People.prototype = {
46			constructor: People
47		};
48
49		People.prototype.sayName = function() {
50			console.log(this.name);
51		};
52
53		People.prototype.sayName.call(people1);
54
55		console.log(Object.getPrototypeOf(people1) == People.prototype);
56
57
58		people2 = new People();
59
60		console.log(people2.prototype);
61

这一种类型似乎略繁琐,但他确实实现了默认值,当然,相比之下实在是不够优秀,有各种问题,包括constructor之类的。这里我们之所以不直接定义函数,而是先用对象,再里面再加一个方法,是因为javascript没有命名空间(namespace)的概念,万一重名了=A=~

1		function Person(name, age, job, friends) {
2			this.name = name || "hi";
3			this.age = age || 19;
4			this.job = job || "Student";
5			this.friends = friends || "No one";
6		}
7

相比之下,我们来看这样一段= =唔,很明显他更加常用。

评论 (0)