Javascript-组合使用构造函数和原型

创建自定义类型最常见的方式就是构造函数与原型模式,构造函数用于定义实例属性,原型用于定义共享属性和方法

2 min read
By myfreax
Javascript-组合使用构造函数和原型

创建自定义类型最常见的方式就是构造函数与原型模式,构造函数用于定义实例属性,原型用于定义共享属性和方法

function Person(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
}
Person.prototype.sayName = function () {
    console.info(this.name);
};
//code...
var person1 = new Person('freax',12,'javascript');
var person2 = new Person('huangyanxiong',12,'php');

console.info(person1.name);//freax  构造函数每个实例都有自己的属性值
console.info(person2.name);//huangyanxiong

//原型对象上的方法共享都是调用原型上的sayName 方法
person1.sayName();    //freax
person2.sayName();    //huangyanxiong

这种构造函数与原型混合模式,是目前ECMAscript应用最广泛,认可度最高的一种自定义类型的方法,但是有时候你可能会对组合构造函数模式和原型模式感到奇怪,也有可能你在编码的过程中你往//code ...的位置写满你的其它代码,然后再往原型添加方法,也有可能你编码的过程中重写整个原型对象(如果重写整个原型对象会切断现有实例和原型对象的联系)到最后可能让自己都不知道往原型添加过原型属性,导致代码难以维护,因此需要一种新的模式设计代码

动态原型模式

 function Person(name,age,job){
   this.name = name;
   this.age = age;
   this.job = job;
   var prototype = Person.prototype; //将Person的原型对象赋值给prototype是为了当改变函数名时尽量减少更改的代码次数
   prototype.prototype.sayName = function () {
      alert(this.name);
   };
   prototype.prototype.a = function () {
      alert(this.name);
   };
   prototype.prototype.b = function () {
      alert(this.name);
   };
 }

 var friend = new Person('freax',23,'javascript');
 friend.sayName();