• 马上有“对象”


      好吧,我是个标题党,我只是想聊一聊对象创建~也就是我们常说的类,只是在ECMAScript中,只有对象,对象创建对象。

     1.最基本的创建方式

        直接创建对象,并设置属性方法~

        var oPerson = new Object;

        oPerson.name = "Pada";

        oPerson.sex = "female";

        oPerson.age = 22;

        oPerson.say = function () {  //say属性存放着函数的指针

          alert(this.name);

        };

      缺点:需要创建多个实例,每个实例对应单一对象

     2.工厂方式

        封装对象,使其能能创建并返回特定类型的对象

        function creatPerson(){ 

          var oPerson = new Object;

          oPerson.name = "Pada";

          oPerson.sex = "female";

          oPerson.age = 22;

          oPerson.say = function () {  

            alert(this.name);

          };

          return oPerson;

        }

        var oPerson1 = creatPerson();

        var oPerson2 = creatPerson();

         但此时oPerson1,oPerson2 属性完全一样,介个感觉不太好,毕竟这个世界又不只有一个人,不然可就真的孤独了,我们可以利用函数传参来区分它们~

        function creatPerson(sName,sSex,iAge){ 

          var oPerson = new Object;

          oPerson.name = sName;

          oPerson.sex = sSex;

          oPerson.age = iAge;

          oPerson.say = function () {  

            alert(this.name);

          };

          return oPerson;

        }

        var oPerson1 = creatPerson("Pada",female,22);

        var oPerson2 = creatPerson("Amy",female,23);

        oPerson1.say();  //"Pada"

        oPerson2.say();  //"Amy"

        缺点:每次创建对象都会创建方法副本,但其实各对象方法是一样的,我们需要想办法共享它~

        

        function say(){

          alert(this.name);

        }

        function creatPerson(sName,sSex,iAge){ 

          var oPerson = new Object;

          oPerson.name = sName;

          oPerson.sex = sSex;

          oPerson.age = iAge;

          oPerson.say = say;  //这样,每次创建时只是创建了指向函数的指针,而非函数体

          return oPerson;

        }

        var oPerson1 = creatPerson("Pada",female,22);

        var oPerson2 = creatPerson("Amy",female,23);

        oPerson1.say();  //"Pada"

        oPerson2.say();  //"Amy"

     3.混合工厂方式

        仅仅只是在工厂方式的基础上构建假的构造函数,建议避免使用~

        function Person(){ 

          var oPerson = new Object;

          oPerson.name = "Pada";

          oPerson.sex = "female";

          oPerson.age = 22;

          oPerson.say = function () {  

            alert(this.name);

          };

          return oPerson;

        }

        var oPerson1 = new Person();

        var oPerson2 = new Person();

      4.构造函数方式

        function creatPerson(sName,sSex,iAge){ 

          this.name = sName;

          this.sex = sSex;

          this.age = iAge;

          this.say = function () {  

            alert(this.name);

          };

          return oPerson;

        }

        var oPerson1 = new creatPerson("Pada",female,22);

        var oPerson2 = new creatPerson("Amy",female,23);

        oPerson1.say();  //"Pada"

        oPerson2.say();  //"Amy"

        缺点:构造函数也会重复生成函数,为每个对象创建独有的函数,该方法也可以先缓存函数,以提高性能~

     5.原型方式

        function Person(){}

        Person.prototype.name = "Pada";

        Person.prototype.sex = "female";

        Person.prototype.age = 22;

        Person.prototype.say = function(){

          alert(this.name);

        };

        var oPenson1 = new Person();

        var oPenson2 = new Person();

        缺点:构造函数没有参数,实例间会相互影响

        function Person(){}

        Person.prototype.name = "Pada";

        Person.prototype.sex = "female";

        Person.prototype.age = 22;

        Person.prototype.sport = new Array("basketball","dance");  //此时存放的是数组对象的指针

        Person.prototype.say = function(){

          alert(this.name);

        };

        var oPenson1 = new Person();

        var oPenson2 = new Person();

        oPerson1.sport.push("swin");

        alert(oPerson1.sport);  //"basketball,dance,swim"

        alert(oPerson2.sport);  //"basketball,dance,swim"

        该解决的问题还是要解决滴,看下面~

     6.混合的构造函数/原型方式

        使用构造函数定义对象所有非函数属性,用原型方式定义对象函数(方法)    

        function Person(sName,sSex,iAge){ 

          this.name = sName;

          this.sex = sSex;

          this.age = iAge;

            this.sport = new Array("basketball","dance");

         }

        Person.prototype.say = function(){

          alert(this.name);

        };

        var oPenson1 = new Person("Pada",female,22);

        var oPenson2 = new Person("Amy",female,23);

        oPerson1.sport.push("swin");

        alert(oPerson1.sport);  //"basketball,dance,swim"

        alert(oPerson2.sport);  //"basketball,dance"

        优点:通过传参使得我们可以构建一般对象,只创建一个say()函数,节约了内存,oPerson1与oPerson2的sport设置互不影响,由于使用了原型方式,我们还可以通过instanceof运算符来判断对象的类型(是否基于某一般对象,或者说是否为某对象实例)

     7.动态原型方法 

        function Person(sName,sSex,iAge){ 

          this.name = sName;

          this.sex = sSex;

          this.age = iAge;

            this.sport = new Array("basketball","dance");

          if(typeof Person._initialized == "undefined"){  //判断say是否已经初始化定义了

            Person.prototype.say = function(){

              alert(this.name);

            };

            Person._initialized = true;

          }

        }

  • 相关阅读:
    仿百度翻页(转)
    文字顺时针旋转90度(纵向)&古诗词排版
    微信小程序使用canvas绘制图片的注意事项
    PHP即时实时输出内容
    使用Android Studio遇到的问题
    RuntimeError: Model class users.models.UserProfile doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
    drf中的各种view,viewset
    代码审计:covercms 1.6
    windows下安装phpredis扩展
    python练习:异常
  • 原文地址:https://www.cnblogs.com/pada/p/3691934.html
Copyright © 2020-2023  润新知