创建自定义类型的最常见方式,就是组合使用构造函数模式与原型模式。
1 window.onload = function() {
2 var person1 = new Person("Nicholas", 29, "Software Engineer");
3 var person2 = new Person("Greg", 27, "Doctor");
4
5 person1.friends.push("Van");
6
7 document.writeln("person1.friends : " person1.friends "<br />"); // Shelby,Court,Van
8 document.writeln("person2.friends : " person2.friends "<br />"); // Shelby,Court
9 document.writeln("person1.friends === person2.friends : " (person1.friends === person2.friends) "<br />"); // false
10 document.writeln("person1.sayName === person2.sayName : " (person1.sayName === person2.sayName) "<br />"); // true
11 };
12
13 /**
14 * 构造函数模式用于定义实例属性
15 * @param {string} name 姓名
16 * @param {number} age 年龄
17 * @param {string} job 工作
18 */
19 function Person(name, age, job){
20 this.name = name;
21 this.age = age;
22 this.job = job;
23 this.friends = ["Shelby", "Court"];
24
25 // 动态原型模式,该代码只有在初次调用构造函数的时候才会执行
26 if (typeof this.sayName !== "function") {
27 Person.prototype.sayName = function() {
28 alert(this.name);
29 }
30 }
31 }
以上方法,对于有其他OO语言经验的开发人员去看,比较容易理解,但是性能上并不推荐。因为每次创建新的实例都需要进行一次判断,哪怕这次的性能损耗是极小的,但毕竟也是有损耗。
我还是将定义方法和共享属性放在外面,通过原型模型去创建自定义方法,如果有更加优质的代码,欢迎分享!
1 window.onload = function() {
2 var person1 = new Person("Nicholas", 29, "Software Engineer");
3 var person2 = new Person("Greg", 27, "Doctor");
4
5 person1.friends.push("Van");
6
7 document.writeln("person1.friends : " person1.friends "<br />"); // Shelby,Court,Van
8 document.writeln("person2.friends : " person2.friends "<br />"); // Shelby,Court
9 document.writeln("person1.friends === person2.friends : " (person1.friends === person2.friends) "<br />"); // false
10 document.writeln("person1.sayName === person2.sayName : " (person1.sayName === person2.sayName) "<br />"); // true
11 };
12
13 /**
14 * 构造函数模式用于定义实例属性
15 * @param {string} name 姓名
16 * @param {number} age 年龄
17 * @param {string} job 工作
18 */
19 function Person(name, age, job){
20 this.name = name;
21 this.age = age;
22 this.job = job;
23 this.friends = ["Shelby", "Court"];
24
25 // 动态原型模式,该代码只有在初次调用构造函数的时候才会执行
26 // if (typeof this.sayName !== "function") {
27 // Person.prototype.sayName = function() {
28 // alert(this.name);
29 // }
30 // }
31 }
32
33 Person.prototype.sayName = function() {
34 alert(this.name);
35 }
更多专业前端知识,请上【猿2048】www.mk2048.com