`

js中,方法定义在构造函数内部,外部以及定义在prototype上的区别

 
阅读更多

         之前一直有对一个方法定义在构造函数中不同的地方有什么区别不太理解,今天闲的无聊,就自己随变弄弄来加深自己的理解,例如下所示:

         function   Car(wheelNum){

                this.wheelNum=num;

                this.Wheel=function(){

                       alert(wheelNum);

                 };

         };

         Car.writeWheel=function(wheelNum){

             alert(wheelNum);

         };

         Car.prototype.writeWheel2=function(wheelNum2){

             alert(wheelNum2);

         };

         var  car1=new  Car(40);

          car1.Wheel();//40;

          Car.wheel();//  Car.wheel  is  not  a  function;

          Car.writeWheel(30);//30;

          Car.writeWheel2(30);//Car.writeWheel2  is  not  a  function;

          car1.writeWheel2(50);//50

          Car.writeWheel2(50);//Car.writeWheel2  is  not  a  function

         总结:

             1:当方法定义在构造函数内部的this上的时候,要想调用该方法,需要使用实例化后的对象来调用,而不能直接使用构造函数来调用该方法;

             2:当方法定义在类上的时候,则该方法只能被构造函数来调用,而不能被构造函数实例化后的对象来调用;

            3:当方法定义在原型(prototype)上时,也是只能通过构造函数实例化后的对象来调用,如果使用构造方法来调用,则会提示XXXX   is   not   a    function;

            4:对于2和1以及3的区别,现在应该是清楚了,但是对于1和3的区别呢?1和3定义的方法,都是不能通过构造函数来调用,而是要实例化后的对象来调用,那么他们之间有什么不一样呢?这里的话就需要对prototype有一定的了解了(不一定要很清楚,因为我自己也不是特别懂哭),通过1的方法定义的方法,在实例化多个对象的时候,同样的会把方法也会复制一遍(即每个实例化后的对象,都有一个方法),这样的话,当需要该构造函数实例化很多对象的时候,每一个实例化后的对象的方法都要占用一定的内存,这样就会导致内存开销太大了;而通过prototype来定义的方法,在实例化对象的时候,都只是在每个对象中复制了一个指向该方法的一个指针,所以实际上,占用的内存只有一个方法,所以对比两者的话,使用prototype来定义方法的话,可以节省很多的内存开销;那么是不是有了后者就不要前者了呢?并不是这样的,在构造函数里面,定义的变量有私有变量(即通过var 定义的变量)和公有变量(即通过this来定义的变量),因为私有变量不能被外界访问,所以我们需要有可以在外界访问私有变量的途径,而在构造函数里面通过this定义的方法可以有效的访问私有变量;

            所以在实际工作的项目中,我们可以根据自己的实际需求来定义将方法放在哪里;

            以上是个人的一些理解,如有理解错误的,欢迎大家来纠正

            

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics