找了下貌似这一篇没写,于是乎坑出了可能是一个月前的代码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
相比之下,我们来看这样一段= =唔,很明显他更加常用。