JS面向对象

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();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值