在学习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. 解决codeblock不能运行的问题

    codeblock 编译失败 软件 IDE codeblock这软件的确不错,但是除此安装使用就会不小心入坑.你是不是满心欢喜的下载好codeblock,敲入代码,点击运行的时候却总是没反应呢? 如果 ...

  2. ajax 原理----初级篇

    一.贴dome,ajax三大步 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  3. spring(二) AOP之AspectJ框架的使用

    前面讲解了spring的特性之一,IOC(控制反转),因为有了IOC,所以我们都不需要自己new对象了,想要什么,spring就给什么.而今天要学习spring的第二个重点,AOP.一篇讲解不完,所以 ...

  4. Java对象的内存模型(一)

    前言 新人一枚,刚刚入门编程不久,各方面都在学习当中,博文有什么错误的地方,希望我们可以多多交流! 最近,在开发App后台过程中,需要将项目部署到云服务器上.而云服务器的内存大小却只有1G.要如何做到 ...

  5. 整合初步______SH

    什么是框架 在的J2EE开发中,经常会提到"框架"这个词汇,例如Spring,Struts,Webx等等都称之为J2EE开发框架.那么,什么是框架呢? 框架的英文为Framewor ...

  6. LoadRunner性能测试专项班隆重开班

    LoadRunner性能测试专项班隆重开班 POPTEST首届高级性能测试提升强化班开课. 也许你只是看到成功者的光鲜,却没看到他们的努力和汗水.不要否定现在,要看到未来.提高自己.怎么自己.成就自己 ...

  7. 老李推荐: 第1章1节《MonkeyRunner源码剖析》概述:前言

    老李推荐: 第1章1节<MonkeyRunner源码剖析>概述:前言   前言 相信大家做过安卓移动平台UI自动化开发的必然会用过,至少听过MonkeyRunner这个名字.MonkeyR ...

  8. 老李分享: Oracle Performance Tuning Overview 翻译下

    1.2性能调优特性和工具 Effective data collection and analysis isessential for identifying and correcting perfo ...

  9. ios animation 动画效果实现

    1.过渡动画 CATransition CATransition *animation = [CATransition animation]; [animation setDuration:1.0]; ...

  10. ultraedit中文乱码解决方案

    高级--->配置--->文件处理--->Unicode/UTF-8检测 打钩自动检测UTF-8 文件,去掉其他钩. 来自为知笔记(Wiz)