1.对象:JS中万物皆对象,它是一个泛指

  • 类:对象的具体的细分 (物以类聚,人与群分。具有相同属性和方法的实例的一个集合总称)
  • 实例:某一个类别中具体的一个事物

对象是一个抽象的概念,类似于我们的自然界;我们自然界中分为了 人类、动物类、植物类...,而我们每一个人都是人类中的一个实例

2.单例模式

  • 对象数据类型的作用:
    把描述同一个事物(同一个对象)的属性和方法放在一个内存空间下,起到了分组的作用,这样不同事物之间的属性即使属性名相同,相互也不会发生冲突

    • ->我们把这种分组编写代码的模式叫做"单例模式"
    • ->在单例模式中我们把person1或者person2也叫做"命名空间"
  • 单例模式是一种项目开发中经常使用的模式,因为项目中我们可以使用单例模式来进行我们的"模块化开"
  • "模块化开":对于一个相对来说比较大的项目,需要多人协作的开发的,我们一般情况下会根据当前项目的需求划分成几个功能版块,每个人负责一部分,同时开发,最后把每个人的代码进行合并

3.工厂模式

  • 单例模式虽然解决了分组的作用,但是不能实现批量的生产,属于手工作业模式->"工厂模式"
  • 把实现同一件事情的相同的代码放到一个函数中,以后如果在想实现这个功能,不需要从新的编写这些代码来了,只需要执行当前的函数即可-->"函数的封装" -->"低耦合高内聚":减少页面中的冗余代码,提高代码的重复利用率

JS是一门轻量级的脚本"编程语言"(HTML+CSS不属于编程语言,属于标记语言)

.net C# php Java c c++ vb vf object-c .... 所有的编程语言都是面向对象开发的->类的继承、封装、多态

  • 继承:子类继承父类中的属性和方法
  • 多态:当前方法的多种形态->后台语言中:多态包含重载和重写
  • “JS中不存在重载”,方法名一样的话,后面的会把前面+ 的覆盖掉,最后只保留一个
  • "JS中有一个操作类似重载但是不是重载":我们可以根据传递参数的不一样的,实现不同的功能

4.构造函数

构造函数模式的目的就是为了创建一个自定义类,并且创建这个类的实例

构造函数模式和工厂模式的区别?

1、执行的时候

  • 普通函数执行->createJsPerson()
  • 构造函数模式->new CreateJsPerson() 通过new执行后,我们的CreateJsPerson就是一个类了
    而函数执行的返回值(p1)就是CreateJsPerson这个类的一个实例

2、在函数代码执行的时候

  • 相同:都是形成一个私有的作用域,然后 形参赋值->预解释->代码从上到下执行 (类和普通函数一样,它也有普通的一面)
  • 不同:在代码执行之前,不用自己在手动的创建obj对象了,浏览器会默认的创建一个对象数据类型的值(这个对象其实就是我们当前类的一个实例)
    接下来代码从上到下执行,以当前的实例为执行的主体(this代表的就是当前的实例),然后分别的把属性名和属性值赋值给当前的实例最后浏览器会默认的把创建的实例返回

创建一个数组:

不管哪一种方式ary都是Array这个类的一个实例

  • 1、

    • JS中所有的类都是函数数据类型的,它通过new执行变成了一个类,但是它本身也是一个普通的函数
    • JS中所有的实例都是对象数据类型的
  • 2、在构造函数模式中,类中(函数体中)出现的this.xxx=xxx中的this是当前类的一个实例
  • 3、
    • p1和p2都是CreateJsPerson这个类的实例,所以都拥有writeJs这个方法,但是不同实例之间的方法是不一样的
    • 在类中给实例增加的属性(this.xxx=xxx)属于当前实例的私有的属性,实例和实例之间是单独的个体,所以私有的属性之间是不相等的

构造函数深入扩展

  • 1、在构造函数模式中new Fn()执行,如果Fn不需要传递参数的话,后面的小括号可以省略
  • 2、this的问题:在类中出现的this.xxx=xxx中的this都是当前类的实例,而某一个属性值(方法),方法中的this需要看方法执行的时候,前面是否有"."才能知道this是谁
  • 3、类有普通函数的一面,当函数执行的时候,var num其实只是当前形成的私有作用域中的私有变量而已,它和我们的f1这个实例没有任何的关系;只有this.xxx=xxx才相当于给f1这个实例增加私有的属相和方法,才和我们的f1有关系...
  • 4、在构造函数模式中,浏览器会默认的把我们的实例返回(返回的是一个对象数据类型的值);如果我们自己手动写了return返回:
    • 返回的是一个基本数据类型的值,当前实例是不变的,例如:return 100; 我们的f1还是当前Fn类的实例
    • 返回的是一个引用数据类型的值,当前的实例会被自己返回的值给替换掉,例如:return {name:"高佳睿"} 我们的f1就不在是Fn的实例了,而是对象{name:"高佳睿"}
  • 5、检测某一个实例是否属于这个类->instanceof

对于检测数据类型来说,typeof有自己的局限性,不能细分object下的对象、数组、正则...

  • 6、f1和f2都是Fn这个类的一个实例,都拥有x和getX两个属性,但是这两个属性是各自的私有的属性,所以:

in:检测某一个属性是否属于这个对象(attr in object),不管是私有的属性还是公有的属性,只要存在,用in来检测都是true

hasOwnProperty:用来检测某一个属性是否为这个对象的"私有属性",这个方法只能检测私有的属性

5.原型模式

构造函数模式中拥有了类和实例的概念,并且实例和实例之间是相互独立开的->实例识别
基于构造函数模式的原型模式解决了 方法或者属性公有的问题->把实例之间相同的属性和方法提取成公有的属性和方法 ->想让谁公有就把它放在CreateJsPerson.prototype上即可

  • 1、每一个函数数据类型(普通函数、类)都有一个天生自带的属性:prototype(原型),并且这个属性是一个对象数据类型的值
  • 2、并且在prototype上浏览器天生给它加了一个属性constructor(构造函数),属性值是当前函数(类)本身
  • 3、每一个对象数据类型(普通的对象、实例、prototype...)也天生自带一个属性:proto,属性值是当前实例所属类的原型(prototype)
  • 4、Object是JS中所有对象数据类型的基类(最顶层的类)
    • 1)、f1 instanceof Object ->true 因为f1通过__proto__可以向上级查找,不管有多少级,最后总能找到Object
    • 2)、在Object.prototype上没有__proto__这个属性

原型链模式

f1.hasOwnProperty("x");//->hasOwnProperty是f1的一个属性
但是我们发现在f1的私有属性上并没有这个方法,那如何处理的呢?
1)通过 对象名.属性名 的方式获取属性值的时候,首先在对象的私有的属性上进行查找,如果私有中存在这个属性,则获取的是私有的属性值;
如果私有的没有,则通过__proto__找到所属类的原型(类的原型上定义的属性和方法都是当前实例公有的属性和方法),原型上存在的话,获取的是公有的属性值; 如果原型上也没有,则继续通过原型上的__proto__继续向上查找,一直找到Object.prototype为止...
-->这种查找的机制就是我们的"原型链模式"
在IE浏览器中,我们原型模式也是同样的原理,但是IE浏览器怕你通过__proto__把公有的修改,禁止我们使用__proto__

  • 1、只有浏览器天生给Fn.prototype开辟的堆内存里面才有constructor,而我们自己开辟的这个堆内存没有这个属性,这样constructor指向就不在是Fn而是Object了

为了和原来的保持一致,我们需要手动的增加constructor的指向

  • 2、用这种方式给内置类增加公有的属性 给内置类Array增加数组去重的方法

我们这种方式会把之前已经存在于原型上的属性和方法给替换掉,所以我们中这种方式修改内置类的话,浏览器是给屏蔽掉的
但是我们可以一个个的修改内置的方法,当我们通过下述方式在数组的原型上增加方法,如果方法名和原来内置的重复了,会把人家内置的修改掉-->我们以后再内置类的原型上增加方法,命名都需要加特殊的前缀

可枚举和不可枚举

6.继承

6.1原型继承

  • ->"原型继承"是我们JS中最常用的一种继承方式
  • ->子类B想要继承父类A中的所有的属性和方法(私有+公有),只需要让B.prototype=new A;即可
  • ->原型继承的特点:它是把父类中私有的+公有的 都继承到了子类原型上(子类公有的)
    核心:原型继承并不是把父类中的属性和方法克隆一份一模一样的给B,而是让B和A之间增加了原型链的连接,以后B的实例n想要中A中的getX方法,需要一级级的向上查找来使用

6.2 call继承

->call继承:把父类私有的属性和方法 克隆一份 一模一样的 作为子类私有的属性

6.3

冒充对象继承

->冒充对象继承:把父类私有的+公有的 克隆一份一模一样的 给子类私有的

6.4

混合模式继承:原型继承+call继承

6.5

寄生组合式继承

关于JS面向对象、设计模式、以及继承的问题总结的更多相关文章

  1. js面向对象--类式继承

    //待研究//类式继承 //js中模拟类式继承的3个函数 //简单的辅助函数,让你可以将新函数绑定到对象的 prototype 上 Function.prototype.method = functi ...

  2. 从零开始的全栈工程师——JS面向对象( 六大继承 )

    一.对象克隆 var obj = { name:'li', age:23 } var obj2 = obj; // 这不是对象克隆 只是把obj的内存地址给obj2 1.for in克隆(浅拷贝)  ...

  3. JavaScript 对象的原型扩展(JS面向对象中的继承)

    <script type="text/javascript"> function person(name, age) { this._name = name; this ...

  4. js面向对象程序设计之继承

    在面向对象语言中继承分成两种:接口继承和实现继承.解释一下,接口继承只继承方法的签名,而实现继承则是继承实际的方法.但是ECMAScript中的函数没有签名所以无法进行接口继承,只能是实现实现继承.而 ...

  5. node.js面向对象实现(二)继承

    http://blog.sina.com.cn/s/blog_b5a53f2e0101nrdi.html 继承是面向对象中非常重要的一个概念,那么在Node.js中如何实现继承呢? node.js在u ...

  6. JS面向对象(3) -- Object类,静态属性,闭包,私有属性, call和apply的使用,继承的三种实现方法

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  7. JS面向对象(2) -- this的使用,对象之间的赋值,for...in语句,delete使用,成员方法,json对象的使用,prototype的使用,原型继承与原型链

    相关链接: JS面向对象(1) -- 简介,入门,系统常用类,自定义类,constructor,typeof,instanceof,对象在内存中的表现形式 JS面向对象(2) -- this的使用,对 ...

  8. js面向对象继承

    前言 最近看到js面向对象这章节了,主要学习了原型和面向对象继承关系,为了梳理自己的知识逻辑,特此记录. js的面向对象 先说说我目前了解的js创建对象方法 1.写一个函数,然后通过new创建对象 2 ...

  9. ES6教程-字符串,函数的参数,了解函数的arguments对象,js面向对象,设计模式-单例模式,解构赋值

    前言 主要讲解了ES6对字符串的拓展,包括includes,startsWith和endsWith,另外增加了字符串模板. Start includes()是否包含 startsWith()以什么开头 ...

  10. js面向对象设计之class继承

    EcmaScript 2015 (又称ES6)通过一些新的关键字,使类成为了JS中一个新的一等公民.但是目前为止,这些关于类的新关键字仅仅是建立在旧的原型系统上的语法糖,所以它们并没有带来任何的新特性 ...

随机推荐

  1. 【Codeforces Round #460 (Div. 2) D】Substring

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 如果有环 ->直接输出-1 (拓扑排序如果存在某个点没有入过队列,说明有环->即入队的节点个数不等于n 否则. 说明可以 ...

  2. 【Henu ACM Round#14 C】Duff and Weight Lifting

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 2^y可以由两个2^(y-1)相加得到. 则有一个贪心的策略. 就是2^x尽量都变成2^(x+1) (即能够凑就尽量凑) 如果x还有 ...

  3. Android.mk脚本推断文件是否存在

    Android.mk 推断文件是否存在,若存在则复制该文件到某个文件夹 $(shell test -f [文件] && echo yes)的值假设是yes, 则文件存在,然后进行she ...

  4. 从2014年D2前端技术论坛看前端发展趋势

    上周六有幸參加了在杭州阿里巴巴西溪园区举办的2014年D2前端技术论坛和晚上的酒会.实地感受了一下阿里巴巴前端开发的技术氛围和影响力.整体上看这次D2规模还是挺大的,国内前端的知名大牛基本上都到了. ...

  5. Oracle的表空间和sqlplus

    1.  表空间的概念 曾经接触过的数据库都没有听到过表空间这个词,在前一段时间看到Oracle数据库的时候发现表空间无处不在. 所以表空间在Oracle数据库中应该是一个非经常常使用而且非常重要的概念 ...

  6. Excel的版本

    https://en.wikipedia.org/wiki/Microsoft_Excel 取自维基百科,需要特别注意的是,从v12开始,有很大的改变.后缀名从xls变为xlsx Versions 5 ...

  7. Kinect 开发 —— 保持视频影像

    相比直接将影像显示出来,如果能将录制到的影像保存到硬盘上就好了.但是,影像录制,是需要一定的技巧,在网上可以看到很多例子演示如何将Kinect获取到的影像以图片的形式保存到本地,前面的博文也介绍了这一 ...

  8. deep-in-es6(三)

    模板字符串:反撇号(`)包起来的内容. eg: var str = `assassin`; console.log(str); 模板占位符:${};可达到数据的渲染,在占位符中可以是表达式,运算符,函 ...

  9. 跟我一起造轮子 手写springmvc

    原创地址:https://www.cnblogs.com/xrog/p/9820168.html 作为java程序员,项目中使用到的主流框架多多少少和spring有关联,在面试的过程难免会问一些spr ...

  10. 各种join一目了然: join 、inner join、left join 、right join、full join

    各种join一幅图一目了然 一下每幅图都是指: A * join B on A.id = B.in 这个帖子也非常形象.比較好:http://www.phpddt.com/db/inner_join- ...