JavaScript中定义对象的方法

一、原始的方式

              

             缺点:需要创建多个car的实例。

二、工厂方法

               

              缺点:每次创建一个新对象必须创建对象的方法,每次调用createCar(),都要创建showColor(),意味着每个对象都有自己的showColor()版本,事实上,每个对象都共享了同一个函数。 

                改进:通过指向已经存在的外在方法,不必让每个对象都单独创建自己的方法。

          

              缺点:感觉showColor()方法和createCar()不像是对象的方法。

三、构造函数方式

           

           与工厂方法的区别:在构造函数内没有创建对象,而是使用 this 关键字。使用 new 运算符构造函数时,在执行第一行代码前先创建一个对象,只有用 this 才能访问该对象。然后可以直接赋予 this 属性,默认情况下是构造函数的返回值(不必明确使用 return 运算符)。

           缺点:和工厂方法一样,改进的方式也是使用外部函数,当然缺点同样存在。

四、原型方式

           

           该方式利用了对象的 prototype 属性,可以把它看成创建新对象所依赖的原型。在这段代码中,首先定义构造函数(Car),其中无任何代码。接下来的几行代码,通过给 Car 的 prototype 属性添加属性去定义 Car 对象的属性。调用 new Car() 时,原型的所有属性都被立即赋予要创建的对象,意味着所有 Car 实例存放的都是指向 showColor() 函数的指针。从语义上讲,所有属性看起来都属于一个对象,因此解决了前面两种方式存在的问题。

         缺点:1)这个函数没有参数,所以无法给函数传递参数,只能在对象创建后才能改变属性的默认值。

                    2)属性指向的是对象,而不是函数时。函数共享不会造成问题,但对象被多个实例共享就会出现大问题。          举例分析: 

             

五、混合的构造函数/原型方式(推荐)

             联合使用构造函数和原型方式,就可像用其他程序设计语言一样创建对象。这种概念非常简单,即用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法)。结果是,所有函数都只创建一次,而每个对象都具有自己的对象属性实例。

              

六、动态原型方式(推荐)

             对于习惯使用其他语言的开发者来说,使用混合的构造函数/原型方式感觉不那么和谐。批评混合的构造函数/原型方式的人认为,在构造函数内找属性,在外部找方法的做法很不合理。所以他们设计了动态原型方式,以提供更友好的编码风格。 
            动态原型方法的基本想法与混合的构造函数/原型方式相同,即在构造函数内定义非函数属性,而函数属性则利用原型属性定义。唯一的区别是赋予对象方法的位置。

                

七、混合工厂方式

                这种方式通常是在不能应用前一种方式时的变通方法。它的目的是创建假构造函数,只返回另一种对象的新实例。这段代码看起来与工厂函数非常相似:

             

               与经典工厂方式不同,这种方式使用 new 运算符,使它看起来像真正的构造函数。由于在 Car() 构造函数内部调用了 new 运算符,所以将忽略第二个 new 运算符(位于构造函数之外),在构造函数内部创建的对象被传递回变量 car。这种方式在对象方法的内部管理方面与经典工厂方式有着相同的问题。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值