js中类或对象的定义

js中类或对象的定义
我们知道,JS是面向对象的,当它涉及到面向对象,它是涉及到类的概念不可避免的。一般来说,像C #,java,这些强类型语言有固定的定义类的语法。JS所不同的是,它可以用多种方法来实现自己的类和对象。一般的实现有以下几种方式:

1。工厂模式
工厂模式是一个工厂函数,它创建一个返回特定对象的类型。示例代码如下所示:
复制代码代码如下所示:
功能createcar(scolor,idoors,停)
{
无功otempcar =新的对象;
otempcar。颜色= scolor;
otempcar门= idoors;
otempcar MPG =问题;
otempcar调色精灵=函数()。
{
警戒(这个颜色);
}
返回otempcar;
}
无功ocar1 = createcar(红
无功ocar2 = createcar(蓝
ocar1.showcolor();
ocar2.showcolor();

这样每次调用它的工厂函数,创建一个新的对象。问题是,每一次新的对象被创建,创建一个新的显示颜色对话框的功能,使每个对象都有自己的版本,显示颜色对话框,并且所有对象共享同一功能的事实。为了解决这个问题,开发人员定义了工厂函数之外的对象方法,然后给对象一个指向这个函数的指针,如下所示
复制代码代码如下所示:
功能显示颜色对话框()
{
警戒(这个颜色);
}
功能createcar(scolor,idoors,停)
{
无功otempcar =新的对象;
otempcar。颜色= scolor;
otempcar门= idoors;
otempcar MPG =问题;
otempcar显示颜色对话框,显示颜色对话框;
返回otempcar;
}
无功ocar1 = createcar(红
无功ocar2 = createcar(蓝
ocar1.showcolor();
ocar2.showcolor();

所以你不需要为每个对象创建自己的显示颜色对话框的功能,但是这个功能创建一个指针。这从函数上解决了这个问题,但是这个函数与对象的方式不同,这就导致了构造函数的构建。

2。建构式
构造函数与工厂函数非常相似,示例代码如下所示:
复制代码代码如下所示:
功能车(scolor,idoors,停)
{
这scolor颜色=;
这idoors门=;
这个问题。MPG =;
这显示颜色对话框=函数()。
{
警戒(这个颜色);
}
}
无功ocar1 =新车(红
无功ocar2 =新车(蓝

在构造函数中,this关键字的使用而不是创建对象的构造函数里面。当用new操作符调用,对象是之前创建的第一行代码被执行,并且只有这可以用来访问对象,但有什么不对,很明显,它的每一个对象将创造自己版本的显示颜色对话框的功能。为了解决这个问题,以下介绍了原型法。

三.原型模式
这种方法利用了对象的原型属性,并将其视为依赖于创建新对象的原型。在这里,使用空构造函数来设置类名。然后所有的方法和属性直接被赋予原型属性:
复制代码代码如下所示:
功能车()
{ }
汽车。原型。颜色红色;
汽车。原型。车门= 4;
汽车。原型。英里= 23;
原型。驱动程序=新数组(迈克
车。原型。调色精灵=功能()
{
警戒(这个颜色);
}

原型只能直接分配,而不是通过构造函数的参数初始化属性的值。这样,会有两个问题,不知道大家都注意到了。第一个问题是,在这种方式中,每个对象都必须创造改变属性的默认值。而不是创建每个对象,你可以有你需要的属性值。这是一个令人讨厌的东西。另一个问题是当属性指的是对象,函数共享是没有问题的,但对象共享是一个问题。因为每个实例通常是由自己的对象实现。

如下:
复制代码代码如下所示:
无功ocar1 =新车();
无功ocar2 =新车();
ocar1.drivers.push(马特);
警报(ocar1。司机); / /迈克,苏,马特输出
警报(ocar2。司机); / /迈克,苏,马特输出

因此,驱动程序属性只是指向对象的指针,因此所有实例实际上都共享同一个对象。

4。混合构造函数/原型模式
这样的想法是使用构造函数定义对象的所有非功能属性,包括常见的属性和对象的属性,并定义功能属性(方法)在原型对象。结果是,所有的功能都只能创建一次,而每个对象都有自己的对象属性的实例,实例代码如下:
复制代码代码如下所示:
功能车(scolor,idoors,停)
{
这scolor颜色=;
这idoors门=;
这个问题。MPG =;
这是驱动程序=新数组(迈克
}
车。原型。调色精灵=功能()
{
警戒(这个颜色);
}
无功ocar1 =新车(红
无功ocar2 =新车(蓝
ocar1.drivers.push(马特);
警报(ocar1。司机); / /迈克,苏,马特输出
警报(ocar2。司机); / /输出迈克苏

从示例代码中可以看出,这种方法同时解决了以前的两个问题。

5。动态原型
我们知道,大多数面向对象的语言有一个视觉封装的属性和方法。上述方法显示颜色对话框的方法是在类外定义。因此,他们设计的动态原型方法。这种方法的基本思想是为混合构造函数/原型相同,唯一的区别在于对象方法如下图所示的位置
复制代码代码如下所示:
功能车(scolor,idoors,停)
{
这scolor颜色=;
这idoors门=;
这个问题。MPG =;
这是驱动程序=新数组(迈克
如果(typeof的车。_initialized = =未定义)
{
车。原型。调色精灵=功能()
{
警戒(这个颜色);
}
}
_initialized =真车;
}

这样,Car.prototype.showColor只创建一次。这样,代码更像其他语言中的类定义。

6。混合工厂模式
这通常是一种不能在前面的方法中使用的方法,其目的是创建一个false构造函数,只返回另一个对象的新实例。
复制代码代码如下所示:
createcar()函数
{
无功otempcar =新的对象;
otempcar颜色为红色;
otempcar门= 4;
otempcar MPG=23;
otempcar调色精灵=函数()。
{
警戒(这个颜色);
};
返回otempcar;
}
新汽车();

因为新的运营商在车叫()构造函数,二新运营商自动忽略。里面的构造函数创建对象传递回变变种,这种方法具有相同的问题作为对象方法的内部管理的经典方法,我们强烈建议:如果不能避免这样的使用,或。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部