标签:返回结果 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对象类(基类)
null
、undefined
基于构造函数创建自定义类(constructor
)
- 1 在普通函数执行的基础上“new xxx()”,这样就不是普通函数执行了,而是构造函数执行,当前的函数名称之为“类名”,接受的返回结果是当前类的一个实例
- 2 自己创建的类名,首字母大写
- 3 这种构造函数设计模式,主要用于组件 类库 插件 框架等的封装,平时编写业务逻辑一般不这样处理
JS中创建值有两种方式(都是Object
的实例)
- 字面量表达式
var obj={}
;(js中的单例模式)(创建出来的值是基本数据类型)- 构造函数模式
var obj=new Object()
;(创建出来的值是引用数据类型)
- 形成一个私有的作用域
- 形参赋值 变量提升
- 浏览器会创建一个对象,[开辟一个新的堆内存],将这个对象指向了this[堆内存指针指向
this
实例]- 代码从上到下执行
- [构造函数特有]代码执行完成,把之前 创建的堆内存地址返回(浏览器默认返回)
- 判断当前构造函数是否有
return
,
return
的是一个基本值,返回的结果依然是类的实例,没有收到影响- 如果返回的是引用值,则把默认返回的实例覆盖,此时接受到的结果就不再是当前类的实例了
- 构造函数中:建议不要轻易
return
引用数据类型
原型(prototype
) 原型链(__proto__
)
- 函数:普通函数 ,类(所以的类:内置类,自己创建的类)
- 对象 :普通对象,数组,正则,
Math
,arguments
,实例书对象类型的(除了基本类型的字面量创建的值),函数的prototype属性,函数也是对象,...
原型的三句话
- 所有的函数数据类型都天生自带一个属性:
prototype(原型)
,这个属性的值是一个对象,浏览器会默认给他开辟一个堆内存- 在浏览器给
prototype
开辟的堆内存中有一个天生自带的属性:constructor
,这个属性存储的值就是当前函数本身- 每一个对象都有一个
__proto___
的属性,这个属性指向当前实例所属类的prototype
(如果不能确定他是谁的实例,都是Object的实例)
原型链
他是一种基于
__proto__
向上查找的机制,当我们操作实例的某个属性或者方法的时候,首先找自己空间中私有的属性或者方法
- 1。找到了,则结束查找,使用自己私有的即可
- 2。没有找到,则基于
__proto__
找到所属类的prototy
,如果找到就用这个公有的,如果没有找到,基于原型上的__proto__
继续向上查找,一直找到Object.prototype
的原型为止,如果没有,操偶作属性的方法不存在
什么是继承?
子类继承父类中的一些属性和方法
原型继承
让子类的原型指向父类的实例
children.prototype=new Parent();[细节]
1、我们首先让子类的原乡指向父类的实例,然后再向子类原乡上扩展方法,防止提前增加方法,等原型重新指向后,之前在子类原型上扩展的方法就没有了(子类原型已经指向新的空间地址)
2、让子类原型重新指向父类实例,子类原型上原有的constructor就没有了,为了办证构造函数的完整性,我们最好给子类的原型重新设置constructor
标签:返回结果 new math 查找 基本数据类型 赋值 ken ++ 变量提升
原文地址:https://www.cnblogs.com/xiaoqi520/p/9994230.html