当前位置: 首页 > 科技观察

代码解释:AGuidetoObject-OrientedProgrammingwithJavaScript

时间:2023-03-13 13:23:53 科技观察

万物从对象开始。对象,也就是我们相互交流的载体,有其属性和方法。对象是面向对象编程的核心,不仅适用于JavaScript,也适用于Java、C、C++等。选择独立的对象而不是单独的变量和函数。以下是讨论面向对象编程(OOP)时最常用的概念:对象、属性、方法类封装抽象重用/继承多态关联聚合组合1.对象、属性、方法1.1对象字面量(Objectliteral)在Settingproperties中大括号在JavaScript中创建一个新对象。对象字面量属性值可以是任何数据类型,例如函数字面量、数组、字符串、数字或布尔值。下面创建一个名为Book的对象,其属性包括作者、出版年份、标题和方法。—summary.constbook={title:"Hippie",author:"PauloCoelho",year:"2018"}对象创建后,可以使用点号获取值。例如,您可以使用book.title。获取标题的值,您可以使用方括号book['title']来访问属性。1.2对象构造函数(Objectconstructor)对象构造函数与常规函数相同。每次创建对象时使用。它可以与新关键字一起使用。当您需要创建具有相同属性和方法的多个对象时,对象构造函数很有用。constbook={title:"Hippie",author:"PauloCoelho",year:"2018"}constbook1={title:"TheAlchemist",author:"PauloCoelho",year:"1988",}如果要创建多本书(book)对象,代码必须为每本书重复。您可以继续创建book对象,但这有点麻烦-但对象构造函数有助于再次使用对象文字。functionBook(书名、作者、年份){this.title=title;this.author=author;this.year=year;}constbook1=newBook('Hippie','PauloCoelho','2018');console.log(book1);>Book{title:"Hippie",author:"PauloCoelho",year:"2018"}//ifwewanttocreatemorethanonebookjustwecallfunctionbookwithnewkeyword.constbook2=newBook('TheAlchemist','PauloCoelho','1988');book1和book2创建Book实例并将其分配给一个变量。想知道一个对象是否是另一个对象的实例。你可以使用instanceof。book1instanceofBook>true1.3Object.create()方法JavaScript中的每个对象都将从主对象创建。任何时候使用大写“O”时,它都是指主对象。我们可以在console控制台中打印主要对象。主要对象有很多方法,我们来看object.create()方法。Object.create()创建方法使用现有对象作为原型来创建新对象。基本语法如下:Object.create(proto,[propertiesObject])proto是新创建对象的原型。propertiesObject是可选的。这是一个简单的例子:constBook={summary:function(){console.log(`${this.title}iswrittenby${this.author}.`)}}constbook1=Object.create(Book);book1。author="PauloCoelho";book1.title="Hippie";console.log(book1.summary());>HippieiswrittenbyPauloCoelho.上面的示例创建了一个原始对象book1并分配了作者和标题。可以看到原始对象中的summary函数:下面详细介绍Object.create()方法。2.类不是对象,它是对象的蓝图和特殊的功能。函数可以使用函数表达式和声明来定义,类也可以。蓝图可用于表示对象的数量。可以使用类关键字和名称。语法类似于Java。类语法是使用面向对象编程和管理原型的好方法:letBook=function(name){this.name=name}letnewBook=function(name){Book.call(this,name)}newBook.prototype=目的。创建(Book.prototype);constbook1=newnewBook(“TheAlchemist”);这个例子使用ES6类语法:classBook{constructor(name){this.name=name}}classnewBookextendsBook{constructor(name){super(name);}}constbook1=newnewBook("TheAlchemist");类语法是语法糖——而在幕后它仍然使用基于原型的模型。类是函数,而函数是JavaScript中的对象。classBook{constructor(title,author){this.title=title;this.author=author;}summary(){console.log(`${this.title}writtenby${this.author}`);}}constbook1=newBook("","");console.log(typeofBook);>"function"console.log(typeofbook1);>"object"3。封装(Encapsulation)封装是指隐藏信息或数据。意味着对象执行其功能而不向外部用户透露任何执行细节。也就是说,它的私有变量只对当前函数可见,对全局作用域或其他函数不可见。constBook=function(t,a){lettitle=t;letauthor=a;return{summary:function(){console.log(`${title}writtenby${author}.`);}}}constbook1=newBook('Hippie','PauloCoelho');book1.summary();>HippiewrittenbyPauloCoelho.上面代码中,书名和作者只在Book函数范围内可见,方法概要对Book用户可见。所以书名和作者都封装在Book中。4.Abstraction抽象是指实现隐藏。这是一种隐藏实现细节的方法,只向用户显示基本功能。换句话说,它隐藏了无关紧要的细节,只展示了必须向外界展示的内容。缺乏抽象会导致代码可维护性问题。constBook=function(getTitle,getAuthor){//Privatevariables/propertieslettitle=getTitle;letauthor=getAuthor;//Publicmethodthis.giveTitle=function(){returntitle;}//Privatemethodconstsummary=function(){return`${title}writtenby${author}.`}//Publicmethodthatathasaccesstoprivatemethod.this.giveSummary=function(){returnssummary()}}constbook1=newBook('Hippie','PauloCoelho');book1.giveTitle();>"嬉皮士"book1.summary();>UncaughtTypeError:book1.summaryisnotfunctionbook1.giveSummary();>“HippiewrittenbyPauloCoelho.”5.重用/继承JavaScript继承是一种允许我们使用现有类创建新类的机制。即子类继承了父类的所有属性和行为。一般来说,JavaScript不是一种基于类的语言。关键字“class”是在ES6中引入的,但它是语法糖,JavaScript仍然是基于原型的。在JavaScript中,继承是通过使用原型来实现的。这种模式称为行为委托模式或原型继承。也可以通过书籍例子来体现:functionBook(title,author,year){this.title=title;this.author=author;this.year=year;this.summary=function(){console.log(`${this.title}iswrittenby${this.author}.`)}}constbook1=newBook('嬉皮','PauloCoelho','2018');constbook2=newBook('TheAlchemist','PauloCoelho','1988');原型继承对于Book的每个实例,我们都在为基类中的方法重建内存。这些方法必须在所有实例之间共享——不应特定于单个实例。图中原型为:letCorebook=function(title){this.title=title}Corebook.prototype.title=function(){console.log(`nameofthebookis${this.title}`);}Corebook.prototype。summary=function(author){console.log(`${this.title}iswrittenby${this.author}`);}letBook=function(title,author){Corebook.call(this,title,author)}书籍.prototype=Object.create(Corebook.prototype);letbook1=newBook('TheAlchemist','PauloCoelho');book1.title();>nameofthebookisTheAlchemistbook1.summary();>TheAlchemistiswrittenbyPauloCoelho在上面的代码中,Book实例有一个A原型的副本,能够链接到Book的原型,而Book的原型又链接到Corebook的原型。6.多态性在不同的对象上使用相同的方法并允许每个对象具有自己的形式或形状的能力称为多态性。letbook1=function(){}book1.prototype.summary=function(){return"summaryofbook1"}letbook2=function(){}book2.prototype=Object.create(book1.prototype);book2.prototype.summary=function(){return"summaryofbook2"}letbook3=function(){}book3.prototype=Object.create(book1.prototype);book3.prototype.summary=function(){return"summaryofbook3"}varbooks=[newbook1(),newbook2(),newbook3()];books.forEach(function(book){console.log(book.summary());});>summaryofbook1>summaryofbook2>summaryofbook3对象之间的关系将通过关联、聚合和组合来定义.7.关联关联是两个或多个对象之间的关系。每个对象都是独立的。换句话说,关联定义了对象之间的多重性:一对一、一对多、多对一、多对多。functionBook(title,author){this.title=title;this.author=author;}constbook1=newBook('嬉皮士','PauloCoelho');constbook2=newBook('TheAlchemist','PauloCoelho');book2.multiplicity=book1book1赋值给book2,属性多样化,显示对象book1和book2之间的关系。两者都可以独立添加和删除。8.聚合聚合是关联的一种特例。在两个对象之间的关系中,一个对象可能比另一个对象更重要。换句话说,当一个对象比另一个对象拥有更多所有权时,就会发生聚合。对象所有者通常称为聚合,所有者称为组件。聚合也称为“Has-a”关系。functionBook(title,author){this.title=title;this.author=author;}constbook1=newBook('嬉皮','PauloCoelho');constbook2=newBook('TheAlchemist','PauloCoelho');letpublication={"name":"newpublicationInc","books":[]}publication.books.push(book1);publication.books.push(book2);book1和book2添加到对象publication下的书籍中。如果在book1和book2运行后删除发布,则Book和发布都将独立运行。9.组合组合是聚合的一个特例。一个对象包含另一个对象,被包含的对象没有它就不能存在。letBook={"title":"TheAlchemist","author":"PauloCoelho","publication":{"name":"newpublicationInc","address":"chennai"}}在这里,属性publication有严格的关系有了Book对象的限制,出版物不能有Book对象。如果图书的ID被删除,出版物也将被删除。RecompositionLightInheritance继承是指一个对象基于另一个对象的情况。例如,book1继承了书名、作者、结语等书籍属性和方法,因此建立了book1is-aBook关系。组合是单个对象的集合,并将它们组合起来构建更复杂的对象。要构建book1,需要一些工具,例如纸和笔。所以book1有一个纸和笔的关系。constgetTitle=(data)=>({title:()=>console.log(`title:${data.title}`)});constgetAuthor=(data)=>({author:()=>console.log(`author:${data.author}`)});constgetSummary=()=>({summary:()=>console.log(`booksummaryneedtoupdate.`)});constBook=(title,author)=>{constdata={title,author}returnObject.assign({},getTitle(data),getAuthor(data),getSummary())}letbook1=Book('TheAlchemist','PauloCoelho');book1.title();>“标题:炼金术士”