1, 构造函数模式:用函数封装来创建对象
1 // 工厂模式 这种创造了很多function 2 function createPerson(name, age, job){ 3 var o = new Object(); 4 o.name = name; 5 o.age = age; 6 o.job = job; 7 o.sayName = function(){ 8 console.log(this.name); 9 } 10 return o; 11 } 12 13 var person1 = createPerson("Nick", 89, "SDE"); 14 person1.sayName(); 15 var person2 = createPerson("Devil", 189, "SDE"); 16 person2.sayName();
2. 构造函数模式(执行了4个步骤:隐式创造对象,将构造函数的作用域赋值给新对象,执行构造函数的代码,在返回新对象)
1 // constructor 隐式得创造了对象,将构造函数的作用域赋值给新对象,执行构造函数中的代码, 然后再返回了此对象============================ 2 function Person(name, age){ 3 this.name = name; 4 this.age = age; 5 } 6 Person.prototype.sayName = function(){ 7 console.log(this.name); 8 } 9 10 var p1 = new Person("zhaoxi" , 22); 11 p1.sayName(); 12 13 console.log(p1.constructor);
3. 原型链模式
实例.constructor = 构造函数;
构造函数.prototype.constructor = 构造函数;(有例外)
实例的指针始终是指向构造函数的原型链的,而不是构造函数本身。那么实例是如何同时继承两边的属性呢?从上面第二条可以知道啦。
1 // 2 function Car(){ 3 4 } 5 6 var car1 = new Car(); 7 console.log(car1.constructor); // Car(){} 8 console.log(Car.prototype.constructor); // Car 9 10 function Bird(){} 11 Bird.prototype = { // 这里重写了原型对象,已经不是原来的啦 12 name : "xian", 13 sayName : function(){ 14 console.log(this.name); 15 } 16 }; 17 var bird1 = new Bird(); 18 console.log(bird1.constructor);// Object() 19 console.log(Bird.prototype.constructor); // Object