之前一直有对一个方法定义在构造函数中不同的地方有什么区别不太理解,今天闲的无聊,就自己随变弄弄来加深自己的理解,例如下所示:
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定义的方法可以有效的访问私有变量;
所以在实际工作的项目中,我们可以根据自己的实际需求来定义将方法放在哪里;
以上是个人的一些理解,如有理解错误的,欢迎大家来纠正
相关推荐
其中,构造函数在定义对象时被调用,析构函数在对象释放时被调用。如果用户没有提供构造函数和析构函数,系统将提供默认的构造函数和析构函数。 1.构造函数 构造函数是一个与类同名的方法,可以没有参数,有一个参数...
简单的c++常识,类的定义,构造函数和析构函数
NULL 博文链接:https://wenzongliang.iteye.com/blog/2163551
定义一个名为 的复数类,其属性数据为复数的实部和虚部,要求构造函数和拷贝构造函数,并能打印复数的值
详细介绍了构造函数、复制构造函数、拷贝构造函数之间的区别
不同之处在于,使用构造函数初始化列表的版本初始化数据成员,没有定义初始化列表的构造函数版本在构造函数体中对数据成员赋值。 请问这里的初始化数据成员与对数据成员赋值的含义是什么?有什么区别? 我知道在数据...
构造函数定义对象+prototype继承的实现,含CSS样式
《Visual C++2012入门经典(第6版)》实例,在派生类的构造函数中调用基类的构造函数
3、请设计一个拷贝构造函数,实现将参数的值全部传递给当前对象,同时输出“拷贝构造函数被调用” 4、请设计一个析构函数,同时输出“析构函数被调用” 5、设计一个成员函数 int dayDiff(CTime t) ,用于计算...
构造函数与默认构造函数的声明、定义、应用、比较
C++中一般创建对象,拷贝或赋值的方式有构造函数,拷贝构造函数,赋值函数这三种方法。下面就详细比较下三者之间的区别以及它们的具体实现 1.构造函数 构造函数是一种特殊的类成员函数,是当创建一个类的对象时,它...
另外在该类中提供一个静态方法计算两个点的直线距离,传入参数为两个Point类实例。然后设计一个测试类来对Point类进行使用。 提示:先定义两个变量来存储Point点的X,Y坐标;无参的构造函数将X,Y坐标赋为0;有参的...
module, 将命名空间定义为构造函数函数( 或者任何对象) Module.js将命名空间定义为构造函数函数( 或者任何对象) 。用法创建一个新模块.Module("Todo.Application", function(Application){ Application.fn.i
1. 从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。问题出来了,如果构造函数是虚的,就需要通过 vtable来调用,可是对象还没有...
c#析构构造函数c#析构构造函数c#析构构造函数c#析构构造函数
本程序包含构造函数和析构函数,可以把构造函数和析构函数的作用区分开
在C+ + 中, 构造函数是一个在构件对象的时 候调用的特殊的函数, 其目的是对对象进行初始 化工作, 从而使对象被使用之前可以处于一种合 理的状态。析构函数是在撤消对象时, 收回对象 中成员数据所占用的存储空间。但...
C++简单类的实现,包括构造函数,析构函数以及拷贝构造函数
定义学生类,构造函数 foreach循环计算学生的平均分
C++ 拷贝构造函数 赋值构造函数 解释