
正文
js实现单例类 js编写一个标准的单例模式类
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
引入的js文件内变量是单例吗
不会影响。
首先你要知道,页面加载和运行js的流程,在页面加载的时候会发送一个接受test.js的请求,接受之后,解析js。
解析js首先将变量和函数读取到一个环境之中,执行say函数就会带动其中的一些变量改变,但是js并没有文件储存的能力(js运行在一个沙箱之中),两个页面加载了他就会开启两个沙箱,两者是不会有任何影响的。
在这里虽然val是一个全局变量,但是即便是全局变量他也有自己的环境,所以在页面2引用test.js不会影响页面1的输出。
楼主可以测试下,结果会告诉你答案~
希望对你有帮助~~~
相关问答
Q1: angularjs怎么编写一个公共的弹出层插件
恰好写过。
ng的组件分为两种形式,一种是用directive封装的custom element形式的component,比如Button、Tooltip这种;另外一种则是以Service形式封装成一个单例的object由angular的IoC注入到controller中,比如notification、或者你需要的modal。
首先要为modal服务设计API,比如modal.open modal.close, 然后要为弹出的modal设计遮罩层,并且确定当同时有多个modal出现在页面上时,遮罩层唯一。
其次,出于ng的特殊性,每次open一个新modal时,都需要利用ng内置的$compile服务对modal内的模板进行编译,并且为了支持controllerAs的关键词,这部分连接需要手动在服务中处理(具体怎么处理百度一下吧,很容易)
以下是我当初设计时写的一些参数,或许你可以参照。
API:
.open(options) = Modal Object Instance
options ::= {
template: String | domclass|Id,
className: String,
scope: AngularScope,
hooks:{
onOpen: Function,
onClose: Function
},
controller:String,
controllerAs:String,
title: String
}
.closeAll
.close(id)
id ::= Number
额外的,这里有一个简单的实现,供你参考
Q2: JS单例模式
在面向对象语言中,调用一个类的方法之前,必须先将这个类实例化,才能调用类方法。
单例模式能使得我们不需要每次都需要实例化一次,因为我们使用的对象都是同一个对象。
单例模式:只允许实例化一次的对象类。
Leader返回一个包含getInstance方法的对象,执行这个方法可以获得_module的实例。
eader_01与leader_02完全相等,说明它们是同一个对象,并不是通过new新获取的对象。
但是在多页面情况下,通过import引入的并不是单例模式,因为
模态框弹窗的时候,不希望有两个弹窗
Q3: ligerUI中ligerDialog和ligerWindow的区别
ligerUI中ligerDialog和ligerWindow的区别:
Dialog 与 Window 最大的区别所在,Dialog 是单例对象,不建议在使用的时候继承与扩展,而 Window 是一个多例类,允许直接继承并扩展。Dialog与Window是继承自同一个父类 l.core.Win。
下面举例证明Dialog 是单例类的事实:
$.ligerDialog.open = function (p)
{
// 实例化一个 l.controls.Dialog 对象
// 内部可以追述到第33行,使用 liger.run() 函数构造 Dialog 实例
return $.ligerDialog(p);
};
$.ligerDialog.close = function ()
{
// 根据 Dialog类型 查到到所有的 dialog 实例对象
var dialogs = l.find(l.controls.Dialog.prototype.__getType());
// 循环每一个 dialog实例并销毁
for (var i in dialogs)
{
var d = dialogs[i];
d.destroy.ligerDefer(d, 5);
}
// 隐藏遮罩层
// 在ligerUI中,所有的窗口使用的是一个全局的mask
// 相关代码可以看 js/core/base.js 598行
l.win.unmask();
};
$.ligerDialog.show = function (p)
{
var dialogs = l.find(l.controls.Dialog.prototype.__getType());
if (dialogs.length)
{
for (var i in dialogs)
{
// 如果已经存在 dialog实例,那么就直接使用实例对象
// 显示已存在的dialog,并返回
dialogs[i].show();
return;
}
}
// 如果不存在 dialog实例,则初始化一个实例并返回
return $.ligerDialog(p);
};
$.ligerDialog.hide = function ()
{
var dialogs = l.find(l.controls.Dialog.prototype.__getType());
// 隐藏dialog实例也是相同的方式
for (var i in dialogs)
{
var d = dialogs[i];
d.hide();
}
};
$.ligerDialog.tip = function (options)
{
// 初始化选项参数
options = $.extend({
showType: 'slide',
width: 240,
modal: false,
height: 100
}, options || {});
$.extend(options, {
fixedType: 'se',
type: 'none',
isDrag: false,
isResize: false,
showMax: false,
showToggle: false,
showMin: false
});
// 构造一个Dialog实例
return $.ligerDialog.open(options);
};
根据上面的代码解读,结论就很清晰了:
Dialog是一个单例对象,不建议继承与扩展
Window是多例类,允许继承并扩展
Q4: JS 面向对象
为了能够清楚的解释这一切,我先从对象讲起。从其他面向对象语言(如Java)而来的人可能认为在JS里的对象也是由类来实例化出来的,并且是由属性和方法组成的。
实际上在JS里并不是如你所想(我开始是这么想的)那样,对象或直接称为object,实际上只是一些映射对的集合,像Map,字典等概念。JS里有大概7种类型(加上Symbol),数字、字符串、null、undefined、布尔、Symbol、对象。除对象以外的其他类型属于原始类型,就是说它们比较单纯,包含的东西比较少,基本上就是字面量所表示的那些(像C语言中的一些类型,就是占那么多空间,没有其他的东西)。object基本上是一些键值对的集合,属于引用类型,即是有一个名字去指向它来供别人使用的,就好像比较重的东西你拿不动,而只是拿了张记录东西所在地的纸条。所以当A对象里嵌套了B对象,仅表示A里面有一个引用指向了B,并不是真正把B包含在A里面,虽然看起来是这样(尤其是从对象的字面量上来看),所以才会有所谓的深拷贝与浅拷贝。
有句话叫“JavaScript里一切皆对象”,是因为在很多情况下原始类型会被自动的转为对象,而函数实际上也是对象,这样这句话看起来就很有道理了。
说明对象的本质是为了正确地认识对象,因为这关系到后面的理解。
Q5: unity的js脚本怎么调用c#的类
在c#中一般会封装成dll文件对外提供接口调用,unity的js脚本也是这样的调用方式。
一、创建dll文件
1。打开vs文件-新建- 项目-C#-类库,输入项目的名称,创建一个dll项目;
2。引入 UnityEngine UnityEditor ;这两个文件放在unity安装目录的Unity\Editor\Data\Managed路径下,
具体添加步骤:右键点击解决方案-添加引用-浏览;
3。如果加入了UnityEngine UnityEditor,在项目中就可以using UnityEngine 和 UnityEditor;如果项目中不需要,也可以省略第二步;
举例说明:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEditor;
using System.Collections;
namespace dlltest
{
class Class2 : MonoBehaviour
{
void Start()
{
Debug.Log("this is unity call C# dll test!");
}
}
}
5。F5启动生成解决方案(debug或者release),把生成的dll放到unity工程的asset下;
6。如果继承了Monobehaviour的类在dll的子对象中有显示,这样就可以绑定到GameObject上了,如果是要引用dll的类,需要using 命名空间,名字一般和项目名称一致才能调用。
关于js实现单例类和js编写一个标准的单例模式类的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。







