工厂模式
1 function createPerson (name,age,job) { 2 var o=new Object(); 3 o.name=name; 4 o.age=age; 5 o.job=job; 6 o.sayName=function(){ 7 alert(this.name); 8 }; 9 return o; 10 }; 11 var person1=createPerson("Terry",24,"Software Engineer"); 12 person1.sayName(); 13 var Person2=createPerson("Terry2",24,"Software Engineer2"); 14 person2.sayName();
构造函数模式
1 function Person(name,age,job){ 2 this.name=name; 3 this.age=age; 4 this.job=job; 5 this.sayName=function(){ 6 alert(this.name); 7 } 8 } 9 var person1=new Person("Terry",23,"Engineer Software"); 10 person1.sayName();
person1对象有一个constructor属性,该属性指向Person,constuctor属性最初是用来标识对象类型的。但是 instanceof操作符要更可靠一些。
1 alert(person1 instanceof Object);//ture 2 alert(person1 instanceof Person);//ture
自定义构造函数意味着将来可以将它的实例标识为一种特定的类型,这正是构造函数模式胜过工厂模式的地方。
构造函数也是函数,任何函数只要通过new操作符来调用,那它就可以做为构造函数;而任何函数不通过new操作符来调用,那它跟普通函数也不会有什么两样。
1、当做构造函数来使用
1 var person=new Person("Terry",23,"Software Engineer"); 2 person.sayName();
2、作为普通函数来调用
1 Person("Terry",25,"Doctor"); 2 window.sayName();
3,在另一对象作用域中调用
1 var o=new Object(); 2 Person.call(o,"Terry",23,"Nurse"); 3 o.sayName();
当在全局作用域中调用一个函数时, this对象总是指向Global对象(在浏览器中就是window对象)。
因此,在调用完函数之后,可以通过window对象来调用sayName()方法,并且还返回了"Terry"。
最后,也可以使用 call()(或者 apply())在某个特殊对象的作用域中调用 Person()函数。
这里是在对象o的作用域中调用的,因此调用后 o 就拥有了所有属性和 sayName()方法。
构造函数的问题
...
...