在学习anjular中Service的使用时,发现和js中的创建对象的方式有一定的联系,所以总结了anjular中Service、Factory、Provider的使用方式与js创建对象的方式

一、先总结下js中创建对象的几种方式

1.工厂模式 
function createObject(username, password) {
var object = new Object(); //等价于 var object={};
object.username = username; object.password = password;
object.get=function(){
alert(this.username); //等价于alert(a.username)
}
return object;
}
var object = createObject("zhangsan", "123"); //此方法没有用new相 当于直接调用函数
object.get(); //zhangsan  
 
特点:每创建一个对象会为方法创建一份独立的空间,较耗内存。因为函数createObject返回了一个对象,创建对象时不用new就直接得到一个对象,。 
 
2.构造函数 
function Person(username, password) {
//在执行第一行代码前,js引擎会为我们生成一个对象
this.username =username; this.password = password;
this.getInfo = function() {
alert(this.username);
}
//此处有一个隐藏的return语句,用于将之前生成的对象返回
//只有在后面用new的情况下,才会出现注释所述的这两点情况
}
var person = new Person("zhangsan", "123");//用了new才能得到一个对象,否则person的值会为undefuned
person.getInfo(); //zhangsan
特点:同样每创建一个对象都会为方法开辟一个独立的空间;在实例化对象时必须要用new,这样this才会指向实例化的对象,不用this相当于直接调用函数,得到的person为undefuned。
 
3. 原型方式与构造函数结合 
function Person(username,password) {
this.username = username;
this.password = password;
}
Person.prototype.getInfo = function() {
alert(this.username);
}
var p = new Person("lisi","123456"); //此方式包含了构造函数方式,所以创建对象需要使用new
p.getInfo();
特点:单纯的原型方式是无法使用形参传递参数的。所有的对象共享同一个方法,使用了构造函数的this,创建对象需要new。
 
二、anjularjs创建服务的三种方法 service、factory、provider
 
  
  

1.service
(1)service是通过构造函数创建服务,一般直接用this,来操作数据、定义函数。
(2)service()方法很适合使用在功能控制比较多的service里面
(3)不能通过config配置
(4)在定义服务时不进行实例化,控制器调用myService时进行实例化,且只进行实例化一次
 
var myApp = angular.module("myApp",[]);
myApp.service("myService",function(){
var data1="data1";
this.data2="data2";
this.getData1=function(){
return data1;
};
});
myApp.controller("myCtr1",["$scope","myService",function($scope,myService){
$scope.getWay1=function(){
console.log( myService.getData1() );
};
$scope.getWay2=function(){
console.log( myService.data2 );
};
}]); <div ng-controller="myCtr1">
<button ng-click="getWay1()"></button> //data1
<button ng-click="getWay2()"></button> //data2
</div>
2.factory
(1)它是一个可注入的function,它和service的区别就是:factory是普通function,而service是一个构造器(constructor),这样Angular在调用service时会用new关键字,而调用factory时只是调用普通的function,所以factory必须返回对象才能得到相应的值,而service可以不返回。
(2) 用 Factory 就是创建一个对象,为它添加属性,然后把这个对象返回出来。你把 service 传进 controller 之后,在 controller 里这个对象里的属性就可以通过 factory 使用了。
(3)在service里面当我们仅仅需要的是一个方法和数据的集合且不需要处理复杂的逻辑的时候,factory()是一个非常不错的选择
(4)同service一样在控制器中注入式进行实例化一次,定义时不进行实例化。
 
var app = angular.module('myApp', []);
app.factory('myFactory', function() {
console.log('instance myFactory');
var factory = {};
var data1= "data1";
factory.data2 = "data2";
factory.getData1 = function() {
return data1;
};
return factory;
}); app.controller('myCtrl',["$scope","myFactory",function(){
$scope.getWay1 = function() {
alert(myFactory.getData1());
};
$scope.getWay2= function() {
alert(myFactory.data2);
};
}]); <div ng-controller="myCtrl">
<button ng-click="getWay1()">按钮一</button> //data1
<button ng-click="getWay2()">按钮二</button> //data2
</div>
factory也可以这样返回对象:
app.factory('myFactory', function() {
return {
getWay1:functory(){
},
getWay2:functory(){
}
}
});
3.provider
(1) Providers 是唯一一种你可以传进 .config() 函数的 service。当你想要在 service 对象启用之前,先进行模块范围的配置,那就应该用 provider。
(2)provider在定义时就进行实例化,且进行实例化一次
(3)provider必须有一个$get方法
 
[例一]
var app = angular.module('myApp', []);
app.provider('testProvider', function(){
console.log('instance testProvider');
var f = function(name) {
alert("Hello, " + name);
};
this.$get = function(){
return f;
};
}); app.controller('myCtrl1', function($scope, testProvider) {
$scope.onclick1 = function() {
testProvider("十盏");
};
});
app.controller('myCtrl2', function($scope , testProvider) {
$scope.onclick2 = function() {
testProvider("provider: 十盏");
};
}); <div ng-controller="myCtrl1">
<button ng-click = "onclick1()">请点击我1</button> //十盏
</div>
<div ng-controller="myCtrl2">
<button ng-click = "onclick2()">请点击我2</button>
//provider: 十盏
</div>
 
[例二]
var app = angular.module('app', []);
app.provider('movie', function () {
var version;
return {
setVersion: function (value) {
version = value;
},
$get: function () {
return {
title: 'The Matrix' + ' ' + version
}
}
}
}); app.config(function (movieProvider) { //在config阶段定义的服务的名字+Provider
movieProvider.setVersion('Reloaded');
});
app.controller('ctrl', function (movie) {
expect(movie.title).toEqual('The Matrix Reloaded');
});
 
  希望大家多多交流与指正!
 
感谢分享的参考资料:
  http://blog.csdn.net/u012841667/article/details/52751222
  https://segmentfault.com/a/1190000003096933
 

anjular中Service、Factory、Provider的使用与js中创建对象的总结的更多相关文章

  1. angularjs---服务(service / factory / provider)

    初angularJs时  常写一些不够优雅的代码  !我总结了一下看看各位有没有中枪的!-----( 这里只针对服务service及其相关! ) 以下做法不太优雅 兄弟controller 之间的相同 ...

  2. json--pyton中obj与json的互转,js中obj与json的互转

    json 解释:json是一种跨平台的通用的数据格式 python中对象(obj)与json之间的相互转换 1.对象(obj)转json格式的字符串 json.dumps(res) res = () ...

  3. angular 服务 service factory provider constant value

    angular服务 服务是对公共代码的抽象,由于依赖注入的要求,服务都是单例的,这样我们才能到处注入它们,而不用去管理它们的生命周期. angular的服务有以下几种类型: 常量(Constant): ...

  4. asp.net后台cs中的JSON格式变量在前台Js中调用方法(前后台示例代码)

    //后台cs代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  5. asp.net后台cs中的JSON格式变量在前台Js中调用方法

    //后台cs代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...

  6. js中的逻辑与(&&)和逻辑或(||)

    之前有一个同事去面试,面试过程中碰到这样一个问题: 在js中写出如下的答案 : var a = 2; var b = 3; var andflag = a && b ; var orf ...

  7. 在JS中关于堆与栈的认识function abc(a){ a=100; } function abc2(arr){ arr[0]=0; }

    平常我们的印象中堆与栈就是两种数据结构,栈就是先进后出:堆就是先进先出.下面我就常见的例子做分析: main.cpp int a = 0; 全局初始化区 char *p1; 全局未初始化区 main( ...

  8. 拾取模型的原理及其在THREE.JS中的代码实现

    1. Three.js中的拾取  1.1. 从模型转到屏幕上的过程说开 由于图形显示的基本单位是三角形,那就先从一个三角形从世界坐标转到屏幕坐标说起,例如三角形abc 乘以模型视图矩阵就进入了视点坐标 ...

  9. js中常用的操作

    1.js中常用的数组操作 2.js中常用的字符串操作 3.js中常用的时间日期操作 4.定时器

随机推荐

  1. iwebshop两表联查

    $tb_goods = new IQuery('goods as g'); $tb_goods->join='left join miao as m on m.goods_id=g.id'; $ ...

  2. sub,dl,dt,排版,横向滚动条,浮动元素居中,box-sizing

    1.sub标签 下标 2.dl,dt,dd用的地方通常是具有标题,而标题下对应有若干列表简单的(栏目标题+对应标题列表)和标题对应下面有内容.在使用时候我们能简洁html代码情况下,学会灵活使用dl ...

  3. 庆祝POPTEST签约企业培训

    庆祝POPTEST签约企业培训 POPTEST与众多培训企业进行技术PK,由于企业认可POPTEST的技术实力,从众多竞争对手中脱颖而出,成功中标清华控股子公司性能测试培训.

  4. 老李推荐:第6章1节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览 2

    事件要到那里去? 每个事件源处理类都维护着一个自己的事件队列, 在Monkey中叫做CommandQueue,里面装的是每个具体的MonkeyEvent事件.当来自网络的字串命令被翻译成对应的Monk ...

  5. BootstrapBootbox居中

    /* 模态框居中样式 */ .bootbox-container { position: fixed; ; ; ; ; ; overflow-y: auto; } .bootbox-container ...

  6. UWP: 掌握编译型绑定 x:Bind

    在 UWP 开发中,我们在进行数据绑定时,除了可以使用传统的绑定 Binding,也可以使用全新的 x:Bind,由于后者是在程序编译时进行初始化操作(不同于 Binding,它是在运行时创建.初始化 ...

  7. Myeclipse快捷键以及使用技巧大全-来自网络

    1. 打开MyEclipse 6.0.1,然后"window"→"Preferences" 2. 选择"java",展开,"Edi ...

  8. ubuntu12.04 desktop默认无ssh支持

    sudo apt-get install ssh 安装下即可.

  9. 关于block使用的几点注意事项

    1.在使用block前需要对block指针做判空处理. 不判空直接使用,一旦指针为空直接产生崩溃. if (!self.isOnlyNet) { if (succBlock == NULL) { // ...

  10. NodeJs之http

    创建新的服务器 创建一个简单的服务 var http = require("http"); var server = http.createServer(); server.lis ...