海阔以鱼跃,天高任鸟飞。喂喂喂!我是MollyMaoli一万人心中有一万个哈姆雷特,一万个开发者对面向对象思想有一万种理解。这里我只简单说明一下我对面向对象思想的理解。我不喜欢轻喷。欢迎大家在评论区留言讨论。基本概念在程序中,我们使用对象来构建现实世界的模型,简化并提供难以(或不可能)使用的功能,以便可以访问它们。这段解释摘自MDN。这是一个转折。这里我们可以用喂鸭子的方式来理解面向对象,粗略的说,长得像鸭子,那就是鸭子。人和机器的区别在于,人有主观意识,而机器没有。一个尖嘴巴,扁脑袋,会吱吱叫,会游泳的生物,那么这就是我们用对象思维构造的鸭子类。机器不会想象这其实是一只和人类一样具有主观意识的大鹅。对象的组成一个基本的对象是由几种数据类型组成的,如果分成大类的话,可以分为行为属性和属性属性:所有的数据类型都可以认为是对象的属性(小鸭的体重,翅膀,feet等都是属性)Behavior:一般指一个函数,赋予对象能力(小鸭会游泳,所以游泳的行为就是小鸭的能力)来实例化对象至此,我们创建了一个duck类,而duck只是一个初始化状态,相当于被冻结了。我们需要对鸭子进行解包,我们可以使用new关键字来实例化鸭子对象。这样我们就得到了一个全新的鸭子对象。new关键字究竟做了什么?可以参考如下代码:varobj={};//获取方法的第一个参数(并删除第一个参数),也就是构造函数varConstructor=[].shift.apply(arguments);//将new对象的内部属性__proto__指向构造函数的原型,这样new对象就可以访问原型中的属性和方法obj.__proto__=Constructor.prototype;//获取构造函数的返回值varret=Constructor.apply(obj,arguments);//如果返回值是对象,则返回对象,否则返回构造函数的实例对象returntypeofret==="object"?回复:对象;thisintheobject对于这个问题,很多初期的学者都被this指向搞糊涂了。其实理解这个,我们只需要记住一句话谁在调用它,it指向谁,this指向当前调用它的执行环境经典例子:varobj={foo:function(){console.log(this.bar)},bar:1};varfoo=obj.foo;varbar=2;obj.foo()//1foo()//2js中的数据类型分为基本数据类型和参考数据类型。原始数据类型按值访问,引用数据类型按引用访问。对象把所有的引用放在栈上,把所有的值放在堆上。获取一个对象的值,需要先获取对象的引用,然后根据引用找到对应的值。如果引用对应的值是函数,由于函数是单个值,所以可以存在不同的执行上下文。那么问题来了,同一个函数在不同的环境中被调用,我们如何获取函数内部当前的执行环境呢?没错,这个的出现,正是为了解决这样的场景问题。总结:一堆属性和行为聚集在一起形成一个基本对象。可以通过new关键字实例化一个对象。由于执行环境不同,对象内部的this点也不同。在调用对象方法时,需要注意this的指向问题。对象系统我们在上面提到了一个基本对象的组成。但是在我们实际的开发中,远比这复杂。往往是多层对象的嵌套或者多个对象通过一个映射文件相互关联,或者一个对象继承另一个对象……从而构建一个更加庞大的对象世界,解决更加复杂的应用场景。我们称这种复杂的对象为对象系统,这种思想被称为面向对象编程的显式原型概念:每个函数都有一个默认的原型属性,使你能够为对象添加属性和方法。functionpeople(name){this.name=name;this.say=function(){console.log(`你好!我是${name}`);};}people.prototype.kungfu=function(){console.log(`我是${this.name},我会中国功夫`);};constqad=newpeople('秦爱德');constzs=newpeople('张三');console.log(qad);console.log(qad.say());console.log(qad.kungfu());console.log(zs);console.log(zs.say());console.log(zs.kungfu());上面的代码创建了一个people构造函数,在其中添加了一个name属性和一个say方法,并在其原型中添加了一个kungfu方法。如何理解内部属性和原型属性?这里我们可以使用css样式方便理解
