1 <!DOCTYPE html>
2 <html>
3 <head>
4 <meta charset="UTF-8">
5 <title></title>
6 <script type="text/javascript">
7
8 /*
9 *
10 * 创建一个Person构造函数
11 * - 在Person构造函数中,为每一个对象都添加了一个sayName方法,目前我们的方法是在构造函数内部创建的,
12 * 也就是构造函数每执行一次就会创建一个新的sayName方法,也就是所有实例的sayName都是唯一的。
13 * 这样就导致了构造函数执行一次就会创建一个新的方法,
14 * 执行10000次就会创建10000个新的方法,而10000个方法都是一摸一样的
15 * 这是没有必要的,完全可以使所有的对象共享同一个方法
16 *
17 */
18
19 function PersonOne(name , age , gender){
20 this.name = name;
21 this.age = age;
22 this.gender = gender;
23 //向对象中添加一个方法
24 this.sayName = function(){
25 alert("Hello大家好,我是:"+this.name);
26 }
27 }
28
29 //创建一个Person的实例
30 var per = new PersonOne("孙悟空",18,"男");
31 var per2 = new PersonOne("猪八戒",28,"男");
32 per.sayName();
33 per2.sayName();
34
35 //------------------------------------------------------------------------------------
36
37 //那怎么办呢?试着将sayName方法在全局作用域中定义
38
39 function PersonTwo(name , age , gender){
40 this.name = name;
41 this.age = age;
42 this.gender = gender;
43 //向对象中添加一个方法
44 this.sayName = fun;
45 }
46
47 function fun(){
48 alert("Hello大家好,我是:"+this.name);
49 };
50
51 //创建一个Person的实例
52 var per = new PersonTwo("孙悟空",18,"男");
53 var per2 = new PersonTwo("猪八戒",28,"男");
54 per.sayName();
55 per2.sayName();
56
57 /*
58 * 可是将函数定义在全局作用域,污染了全局作用域的命名空间
59 * 而且定义在全局作用域中也很不安全
60 */
61
62 //------------------------------------------------------------------------------------
63
64 //那么可以怎么改呢?向原型中添加sayName方法
65
66 /**
67 * 以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,
68 * 这样不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了
69 */
70
71 function PersonThree(name , age , gender){
72 this.name = name;
73 this.age = age;
74 this.gender = gender;
75 }
76 //向原型中添加sayName方法
77 PersonThree.prototype.sayName = function(){
78 alert("Hello大家好,我是:"+this.name);
79 };
80
81 //创建一个Person的实例
82 var per = new PersonThree("孙悟空",18,"男");
83 var per2 = new PersonThree("猪八戒",28,"男");
84 per.sayName();
85 per2.sayName();
86
87
88
89 </script>
90 </head>
91 <body>
92 </body>
93 </html>