1、JS构造类实例:
function Person(name,age,address){ this.name=name; this.age=age; this.address=address; this.showInfo=function(){ alert("name: "+this.name+" age: "+this.age+" address: "+this.address); } } var lx = new Person("lx",26,"jr"); var hammer = new Person("hammer",26,"lyg")
这种方法被称为构造函数方式,即:先声明一个Person类,lx和hammer为其两个对象,注意this.showInfo=function(){}方法,this指的是一个对象,即是每一个对象都有一个showInfo方法,势必会造成资源浪费。
2、原型方式
function Person(){ } Person.prototype.name=""; Person.prototype.age=26; Person.prototype.address=""; Person.prototype.showInfo=function(){ alert("name: "+this.name+" age: "+this.age+" address: "+this.address); }
这种方法被称为原型方式 。该方法避免了showInfo函数被每个对象都创建,而是所有Person类的对象共享这一个 函数,然后在调用的时候,使用this关键字找到实例对象的name,这种方式也有问题,即name,age和address被所有对象共享,如果一个对 象修改了name那么其他的对象的name也会相应的改变。
3、混合的构造函数/原型方法
function Person(name,age,address){ this.name=name; this.age=age; this.address=address; } Person.prototype.showInfo=function(){ alert("name: "+this.name+" age: "+this.age+" address: "+this.address); }
结合1、2两种的优点
4、动态原型
function Person(name,age,address){ this.name=name; this.age=age; this.address=address; if(typeof Person._initialized == "undefined"){//此时此刻,这里的Person._initialized成立,继续执行下面的函数 Person.prototype.showInfo=function(){ alert("name: "+this.name+" age: "+this.age+" address: "+this.address); } } Person._initialized = true; //初始化次数为1 }
动态原型方式 注意继承问题
function Person(name,age,address){ this.name=name; this.age=age; this.address=address; if(typeof Person._initialized == "undefined"){ Person.prototype.showInfo=function(){ alert("name: "+this.name+" age: "+this.age+" address: "+this.address); } } Person._initialized = true; } //继承 function HuangPerson(name,age,address){ Person.call(this,name,age,address); this.name=name; this.age=age; this.address=address; // HuangPerson.prototype = new Person (); // 则会因为对象因为被提前实例化而导致后面的showName方法失效, // 用动态原型方法来构造函数的好处就是更加像一个类,但是如果用来继承, // 则因为实例化要在函数结束后进行 if(typeof HuangPerson._initialized == "undefined"){ HuangPerson.prototype.showName=function(){ alert("name: "+this.name); } } HuangPerson._initialized = true; // HuangPerson.prototype = new Person (); // showName方法有效,但是没有继承showInfo方法 } HuangPerson.prototype = new Person();//只有写在外面 function test2(){ var person = new Person("hammer",26,"lyg"); person.showInfo(); var huangPerson = new HuangPerson("lx",27,"jr"); huangPerson.showName(); huangPerson.showInfo(); }