优秀程序员web前端javascript面向对象学习路线,面向对象就是使用对象,面向对象开发就是使用对象来开发。面向过程就是以面向过程的方式进行开发。面向对象是面向过程的封装。面向对象的三大特点:抽象: 如果需要一个对象来描述数据,需要提取这个对象的核心数据,提出需要的核心属性和方法,对象的具体含义没有特定的环境是无法弄清楚的。 狭义的抽象,即代码中的抽象,就是将一些关联的业务逻辑分离成属性和方法(行为),这些属性和方法可以构成一个对象。 这种抽象是将难以理解的代码泛化成与现实世界相关的概念,例如食物这样的对象:属性可以概括为“海底捞”、“自助餐”、“饭碗”和很快;方法(行为)可以概括为“昂贵”、“负担得起”、“便宜”等。varfineFood={name:'海底捞',seat:'VIP席',Number:4,shout:function(){console.log('鬼鬼鬼');//这里是你的业务逻辑代码,这里我干脆用这个代替},eat:function(){console.log('吃土,哈哈!');},Reason:function(){console.log('贵是有原因的');}};封装: 对象是数据和函数的组合。简单理解,这就是Javascript对象的封装,是键值对的集合。如果键值是数据,则称为属性。如果key-value是一个函数,就是Callitmethod。 对象是对属性和方法的封装 方法是对过程的封装 封装是将抽象出来的数据和对数据的操作封装在一起。数据在内部受到保护,程序的其他部分只能通过授权操作才能对数据进行操作。JS封装只有两种状态,一种是public,一种是private。functionPerson(name,seatl){this.name=name;//publicvarseat=座位;//privatethis.showInfo=function(){//publicwindow.alert(this.name+""+seat);}functionshowInfo2(){//私有函数window.alert("Hello"+this.name+""+seat);}}varp1=newPerson('Cece',20,10);window.alert(p1.name+"is"+p1.age);//cece是undefinedp1.showInfo();//cece20p1.showInfo2();//报错 构造方法和原型方法给对象添加方法的区别://1.添加方法functionfineFood(name){this.name=name;this.seat=function(){window.alert("请"+this.name+"几位客人");}}varfineFood1=newfineFood("aa");varfineFood2=newfineFood("bb");if(fineFood1.shout==fineFood.shout){window.alert("equal");}else{窗口。alert("notequal");}//会输出"notequal"//2.通过原型函数fineFood(name){this.name=name;为对象添加方法}fineFood.prototype.shout=function(){window.alert("Please"+this.name+"SeveralVIPs");}varfineFood1=newfineFood("aa");varfineFood2=newfineFood("bb");if(fineFood1.shout==fineFood2.shout){window.alert("equal");}else{window.alert("notequal");}//会输出"equal"通过原型给所有对象添加方法,但是这个方法是访问不到的类的私有变量和方法;通过构造函数分配成员方法,为每个对象分配一个独立的代码的缺点是,如果对象实例很多,函数的资源占用会很大,并且可能导致内存泄漏。原型法就是大家共享相同的代码,所以不会有这样的缺点。 因此,通过构造函数添加成员方法和通过原型方法添加成员方法的区别:1).通过原型方法分配的函数被所有对象共享;2).通过原型方法分配的属性是独立的;3).如果想让所有的对象都使用同一个函数,最好使用原型方法来添加方法,这样可以节省内存。继承 函数可以继承另一个对象,构造函数实例化的对象除了自身的成员外,还有被继承对象的成员。 原型链是一种机制,意味着每个JavaScript对象都有一个内置的proto属性,指向创建它的构造函数的原型属性。 原型链的作用是实现对象的继承。要理解原型链,需要从函数对象、构造函数、new、原型和_proto_这五个函数入手。函数对象在JavaScript中,函数是对象,程序可以随意操作它们。例如,您可以将函数分配给变量,将它们作为参数传递给其他函数,设置它们的属性,甚至调用它们的方法。//普通对象:varo1={};varo2=newObject();//函数对象:functionf1(){};varf2=function(){};varf3=newFunction('string','console.log(字符串)');简单地说,任何使用function关键字或Function构造函数创建的对象都是函数对象。此外,只有函数对象具有原型属性。constructorconstructor函数还有一个用法,就是把它当作一个构造函数来使用。本机构造函数,如Object和Array。此外,您还可以创建自定义构造函数来自定义对象类型的属性和方法。功能人(姓名,年龄,工作){this.name=name;这个。年龄=年龄;这个。工作=工作;this.sayName=function(){console.log(this.name);};}varperson1=newPerson("Stone",28,"aa");varperson2=newPerson("Sophie",29,"bb"); 我们创建一个自定义构造函数Person(),并通过该构造函数创建两个普通对象person1和person2,它们都包含3个属性和1个方法。您应该注意到函数名称Person中的大写P。按照惯例,构造函数应始终以大写字母开头,而非构造函数应以小写字母开头。这种方式是从其他面向对象语言中借鉴来的,主要是为了区别于JavaScript中的其他函数;因为构造函数本身也是一个函数,但是可以用来创建对象。new运算符 要创建Person的新实例,必须使用new运算符。这样调用构造函数实际上会经历以下4个步骤:创建一个新对象;将构造函数的范围分配给新对象(因此this指向新对象);执行构造函数中的代码(为这个新对象添加属性);返回新对象。
