当前位置: 首页 > Web前端 > HTML

JavaScript面向对象OOM2(JavaScript对象创建工厂模式和构造函数模式)

时间:2023-04-02 16:47:34 HTML

在创建对象时,使用对象字面量和newObject()构造函数来创建对象是最简单方便的方法。但是在初始阶段一切都难免会出问题,没有普适性,也就是说我必须对世界上(程序中)使用的所有对象都使用varxxx={},因为'lazy'是程序员无法接受。即使你能接受这种创作方式,也不能保证所有的对象都属于哲学问题。于是,优秀的程序员利用现有的规则创造出各种优秀的解决方案——这些优秀的解决方案统称为设计模式。在JavaScript中,从初级到高级的设计模式之间的区别在于它们的副作用的大小。依次又可以分为:工厂模式、构造器模式、原型模式、others同时,使用设计模式也可以优雅地解决JavaScript在ES6之前没有类的尴尬问题。工厂模式工厂模式顾名思义就是创建对象的工厂。工厂可以创建一类具有相似结构和功能的对象。这种模式的诞生也基本解决了:创建多个对象时,需要大量重复的代码。让我们首先看看如何在这种设计模式中组织我们的代码:functioncreatePerson(name,age){varobj=newObject();obj.name=名称;obj.age=年龄;obj.say=function(){console.log(this.name)}returnobj;}varp1=createPerson('ZhangSan',12);p1.say()//ZhangSan是一种设计模式,叫做工厂模式:它指的是用一个统一的方法(function,因为Js没有class)来描述对象创建的细节。这个对象是封装的,每次用到类似的对象,都是用这个工厂函数来创建的。它抽象了创建对象的过程。当然,处于起步阶段的工厂模式肯定有其起步阶段的原因:优点:工厂功能可以解决创建多个类似功能对象的问题。缺点:工厂模式无法解决对象识别问题:不知道对象是什么类型。对于使用工厂函数创建的对象,只有开发者知道它的类型(通过工厂函数的变量名),但程序仍然认为它是一个普通对象。每个对象都是工厂创建的全新对象。构造函数模式在JavaScript开发中,经常听到和使用的一个术语叫做构造函数。这里的构造器来自于构造器模式的设计模式。在长期的传承中,文化或其他名词会成为一个统称,所以人们常说的构造器有时指的是构造器模式,有时指的是构造器模式创建的对象。构造函数方法(实例的构造函数)。构造函数用于创建特定类型的对象。比如Js原生提供的Object和Array。两者都是由构造函数模式创建的本机构造函数。约定俗成,看这种设计模式如何组织代码:functionPerson(name,age){this.name=name;这个。年龄=年龄;this.say=function(){console.log(this.age);}}varp1=newPerson('ZhangSan',12);varp2=newPerson('LiSi',22);p1.say()//12p2.say()//22使用构造器模式与创建的区别工厂模式下的对象:没有明显的创建对象的过程:(newObject()的过程)直接给this赋参数。(因为没有显式创建对象,所以需要用this来赋值)没有return。构造函数的首字母大写,这是代码风格的改变(为了与其他OOM语言的代码风格保持一致)。要创建由构造函数创建的对象,您需要使用newPerson()来创建它。使用构造函数创建对象要经过以下四个过程:创建一个新对象构造函数的作用域是赋予新对象的。this指向新对象执行内部代码,为新对象添加属性和方法并返回新对象。构造函数创建的对象称为构造函数的实例,在实例中会有一个constructor属性,指向创建它的构造函数。(证明你来自哪里)p1.constructor==Person;//truep2.constructor==Person;//true可以检测到每个实例。检测对象是否属于某种类型,可以使用instanceofXX。p1instanceofPerson//truep1instanceofObject//true了解了构造函数方式创建实例的过程和方法后,下面介绍在使用构造函数方法中的一些不为人知的秘密(进阶知识点):当使用构造函数时正常操作是:使用operatornew。但也可以直接作为普通函数使用。//上一个演示中的人物varp3=Person('Person3',33);p3;//undefined;p3.say();//不明确的;Person('Person4',44);window.say();//44;如果构造函数作为普通函数使用,则无法构造实例,即使构造了实例也是undefined。直接使用构造函数作为普通函数使用,属性和方法会添加到全局(window/global)中。当然你也可以使用call将this指向其他对象。(不知道call的可以先忽略,call是改变this指针的方法之一)。细心的孩子在了解了高级用法后发现,构造函数方法是Level2设计模式,肯定有问题。其实很简单。在创建构造函数的过程中,解决了工厂模式创建的对象不知道类型的问题(不知道从哪里来的)。从概念上讲,实例的属性和方法都应该唯一指向,理想情况下指向构造函数。但是有一点不尽如人意:属性都很好地指向了构造函数。this.name=name方法偷偷创建了一个新对象(函数也是一个对象)。这不符合理想情况,因为此时:p1.say===p2.say//false原理也很明确:this.say=function(){}isthis.say=newFunction()。这时构造函数补救措施出现了:varPerson=function(name,age){this.name=name;这个。年龄=年龄;this.say=sayFunc;}varsayFunc=function(){控制台。log(this.age)}使用一个额外的函数将构造函数中的方法指向外部,从而保证实例方法相同。俗话说,补救措施终归是补救措施:当构造函数中有大量的方法时,就会有大量的外部补救方法。补救措施在构造函数之外,根本没有封装。外部方法也是一个普通函数,也可以由其他方法或构造函数执行。全局(window/global)加入外部方法,浪费性能。如果在窗口上调用,则指向窗口。导致this指向混乱(谁调用,this指向谁),所以构造函数的方法仍然是一个不完善的方法。但是在开发速度上,构造函数设计模式还是有很大优势的。而当你需要你的方法被全局使用时,构造函数模式是最合适的,这也是Object和Array原生构造函数出现的原因。