码迷,mamicode.com
首页 > Web开发 > 详细

js面向对象

时间:2018-11-21 16:06:07      阅读:218      评论:0      收藏:0      [点我收藏+]

标签:返回结果   new   math   查找   基本数据类型   赋值   ken   ++   变量提升   

单例设计模式(SingLeton Pattern)

var一个变量,存储一个对象

 

var person={
    name:"xa",
    age:18
}

 

  1.表现形式 var obj={xxx:xxx} 。在单例设计模式中,obj不仅仅是对象名,他被称为“命名空间”【NameSpace】,把描述事务的谁能够存放在命名空间中,多个命名空间是独立分开的,互不冲突。 
  2.作用:把描述同一件事务的属性和特征进行归类(存储在同一个堆内存中),因此避免了全局变量之间的冲突和污染。 
  3.单例设计模式命名的由来:每一个命名空间都是JS中Object这个内置基类的实例,而实例之间是相互独立互不干扰的。所以我们称之为“单例:单独的实例”

高级单例模式

1 var nameSpace=(
2     var n=0;
3     function fn(){
4     }
5     return {
6         fn:fn
7     }
8 )()

  1.在给命名空间赋值的时候,不是直接赋值一个对象,而是先执行匿名函数,形成一个私有作用域AA(不销毁的栈内存),在AA创建一个内存,把堆内存的地址赋值给命名空间。

   2.这种模式的好处:我们完全可以在AA中创造很多内容(变量OR函数),哪种需要外部调取使用的,我们暴露到返回的对象中(模块化实现的一种思想)

 1 var n=2;
 2 var obj={
 3     n:3,
 4     fn:(function (n){
 5      n*=2; 
 6      var n=5;
 7      return function (m) {
 8          console.log(m+(++n)
 9         }
10     } )(n)
11 };
12 var fn=obj.fn;
13 fn(3);
14 obj.fn(3);
15 console.log(n,obj.n);

面向对象编程

整个JS就是基于面向对象设计和开发出来的语言,我们学习和实战的时候也要按照面向对象的思想去体会和理解

  • 对象:万物皆对象
  • 类:对象的具体细分(按照功能特单进行分类:大类,小类)
  • 实例:类中具体的一个事物(拿出类别中的具体一个实例进行研究,那么但钱类别下的其他实例也具备哲学特点和特征)

JS中的内置类 
Object对象类(基类)

  • JS中的任何数据类型都是它所属的类,除了nullundefined
  • 类的首字母都是大写

构造函数constructor

基于构造函数创建自定义类(constructor

  • 1 在普通函数执行的基础上“new xxx()”,这样就不是普通函数执行了,而是构造函数执行,当前的函数名称之为“类名”,接受的返回结果是当前类的一个实例
  • 2 自己创建的类名,首字母大写
  • 3 这种构造函数设计模式,主要用于组件 类库 插件 框架等的封装,平时编写业务逻辑一般不这样处理

JS中创建值有两种方式(都是Object的实例)

  • 字面量表达式 var obj={};(js中的单例模式)(创建出来的值是基本数据类型)
  • 构造函数模式 var obj=new Object();(创建出来的值是引用数据类型)

构造函数执行的机制

  • 形成一个私有的作用域
  • 形参赋值 变量提升
  • 浏览器会创建一个对象,[开辟一个新的堆内存],将这个对象指向了this[堆内存指针指向this实例]
  • 代码从上到下执行
  • [构造函数特有]代码执行完成,把之前 创建的堆内存地址返回(浏览器默认返回)
  • 判断当前构造函数是否有return, 
    • return的是一个基本值,返回的结果依然是类的实例,没有收到影响
    • 如果返回的是引用值,则把默认返回的实例覆盖,此时接受到的结果就不再是当前类的实例了
  • 构造函数中:建议不要轻易return引用数据类型

 

原型链设计模式

 

原型(prototype) 原型链(__proto__

 

  • 函数:普通函数 ,类(所以的类:内置类,自己创建的类)
  • 对象 :普通对象,数组,正则,Matharguments,实例书对象类型的(除了基本类型的字面量创建的值),函数的prototype属性,函数也是对象,...

 

原型的三句话

 

  • 所有的函数数据类型都天生自带一个属性:prototype(原型),这个属性的值是一个对象,浏览器会默认给他开辟一个堆内存
  • 在浏览器给prototype开辟的堆内存中有一个天生自带的属性:constructor,这个属性存储的值就是当前函数本身
  • 每一个对象都有一个__proto___的属性,这个属性指向当前实例所属类的prototype(如果不能确定他是谁的实例,都是Object的实例)

 

原型链

 

他是一种基于__proto__向上查找的机制,当我们操作实例的某个属性或者方法的时候,首先找自己空间中私有的属性或者方法

  • 1。找到了,则结束查找,使用自己私有的即可
  • 2。没有找到,则基于__proto__找到所属类的prototy,如果找到就用这个公有的,如果没有找到,基于原型上的__proto__继续向上查找,一直找到Object.prototype的原型为止,如果没有,操偶作属性的方法不存在

 

类的继承

 

什么是继承? 
子类继承父类中的一些属性和方法

 

原型继承

 

让子类的原型指向父类的实例 
children.prototype=new Parent();

[细节] 
1、我们首先让子类的原乡指向父类的实例,然后再向子类原乡上扩展方法,防止提前增加方法,等原型重新指向后,之前在子类原型上扩展的方法就没有了(子类原型已经指向新的空间地址) 
2、让子类原型重新指向父类实例,子类原型上原有的constructor就没有了,为了办证构造函数的完整性,我们最好给子类的原型重新设置constructor

 

js面向对象

标签:返回结果   new   math   查找   基本数据类型   赋值   ken   ++   变量提升   

原文地址:https://www.cnblogs.com/xiaoqi520/p/9994230.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!