• 面向对象程序设计(一):创建对象


    我们经常用来创建对象的方式有如下几种:

    一:对象字面量或者object构造函数

    var person ={ }
    
    var person = new Object()

    这两个都可以用来创建单个对象,但存在一个问题,当用作一个接口来创建很多类似的对象时,会产生大量的重复代码,于是有了下面的方式;

    二:工厂模式

    function createPerson(name,sex,age) {
      var  o=new Object();
      o.name=name;
      o.sex=sex;
      o.age=age;
      o.sayName=function(){
        alert(this.name);
      }
      return o;
    }
    
    var person1=createPerson("lilei”,"男",18);

    工厂模式虽然解决了创建多个类似对象代码重复的问题,但是它也存在一个问题,无法判断这个对象的类型(只知道是object对象),于是有了下面的方式;

    三:构造函数模式

    function Person (name,age,sex) {
      this.name=name;
      this.age=age;
      this.sex=sex;
      this.sayName=function(){
        alert(this.name);
      };
    }
    
    var person1=new Person("lilei",18,"男");
    var person2=new Person("xiaomei",18,"女");

     (若有人不懂构造函数,请自行搜索补充构造函数的相关知识点喔)

    alert(person1 instanceof Person) true
    alert(person1 instanceof Object) true

     创建自定义构造函数就意味着将来可以将实例标记为特定的类型,这正是胜过工厂模式的地方;但是它也存在一个问题,每次new实例的时候,

    构造函数中的属性都会重新创建一遍,也就意味着person1和person2中具有相同功能的sayName函数其实是两个不同的函数,如下验证:

    alert(person1.sayName==person2.sayName)  false

    实现相同的功能,却要实例化两次,占用两个不同的内存,这就是构造函数存在的问题,于是,有了下面的方式;

    四:原型模式(若对原型还不太理解,请看我关于原型的文章http://www.cnblogs.com/lichunyan/p/8372235.html )

    function Person () {
    
    }
    Person.prototype.name="lilei";
    Person.prototype.sex="男";
    Person.prototype.age="18";
    Person.prototype.sayName=function (){
      alert(this.name);
    }
    
    var person1=new Person();
    var person2=new Person();
    person1.sayName(); ---"lilei"
    person2.sayName();  ---"lilei"
    
    alert( person1.sayName() == person2.sayName());  true

     WOO~,所有实例共享了构造函数所有的属性及方法,貌似很完美了,但是,机智的你有没有发现什么不完美的地方呢?我来告诉你:

    1.所有实例都共享构造函数的属性,所以,每个实例取到的都是相同的值,且不能传参修改;

    2.最大的问题是由于共享引起的,其中一个实例修改了属性,则所有实例都会被动修改;

    person1.name="hanmeimei";
    alert(person2.name);   ---"hanmeimei"

    如果我们要的就是所有实例有相同的值,那这样正好,但是,如果想让每个实例的属性各不同且互不影响,那问题就来了,于是,有了下面的模式;

    五:组合使用构造函数和原型模式

    function  Person (name,age){
      this.name=name;
      this.age=age;
    }
    Person.prototype.sayName=function(){
      alert(this.name);
    }
    
    var person1=new Person("lilei","18");
    var person2=new Person("hanmeimei","18");
    
    person1.sayName();  ---"lilei";
    person2.sayName();  ---"hanmeimei";
    
    person1.age=17;
    
    alert(person1.age); ---17
    alert(person2.age); ---18

    实例属性都是定义在构造函数中,共享的方法在原型中,两者完美结合,既实现了每个属性有自己的属性值,又实现了共享方法统一定义。

    这是目前使用最广泛,认同度最高的一种创建对象的方法;

    当然,还有一些其他模式,比如:动态原型模式,寄生构造函数模式等,但是目前很少用到,有兴趣的可以搜索了解一下。

  • 相关阅读:
    HTML+CSS,让div在屏幕中居中(水平居中+垂直居中)方法总结
    HTML+CSS,让div在屏幕中居中(水平居中+垂直居中)方法总结
    How to set the Default Page in ASP.NET?
    百练1089:数字反转
    百练1089:数字反转
    【分治的典型应用:归并排序】
    【分治的典型应用:归并排序】
    【分治的典型应用:归并排序】
    【分治的典型应用:快速排序】
    【分治的典型应用:快速排序】
  • 原文地址:https://www.cnblogs.com/lichunyan/p/8317870.html
Copyright © 2020-2023  润新知