導航:首頁 > 編程語言 > js單例創建一個對象

js單例創建一個對象

發布時間:2024-11-28 05:32:35

❶ angularjs的服務是單例對象是什麼意思

服務的本質是一個單例對象,既然是一個js對象,那麼它肯定有屬性和方法。
當我們把服務注入到控制器中時,我們就可以調用服務,也就是一個js對象的屬性和方法了。
這樣理解起來是不是很簡單,所謂地調用一個服務,其實就是使用一個js對象的屬性或方法。
最常見的注冊服務的方法是factory()方法。
factory(name,function(){
return{
};

})

它包含兩個參數:
1、name
2、一個函數
name是用來注冊這個服務的名稱,function中會返回一個對象或者函數。這點是不是和我們指令的注冊方法十分相似呢,
是的他們都是用一個name來注冊一個指令或者是服務的名稱。然後用function返回一個對象。
其實,說白了就是用一個name來表示一個js對象。
然後指令調用指令這個js這個對象的時候,用的是html中的標簽來調用。而調用服務這個js對象時,是在controller中用服務的名字來實現服務的調用。
我們來看一個controller中調用service的例子:

.controller("myController",function($scope,myService){
$scope.name = "kobe";
$scope.age = 39;
alert(myService.serviceName);
myService.serviceMethod();
})
.factory("myService", function(){
return{
serviceName:"testService",
serviceMethod:function()

❷ 何時應該使用Directive,Controller,Service

AngularJS是一款非常強大的前端MVC框架。同時,它也引入了相當多的概念,這些概念我們可能不是太熟悉。(譯者註:老外真謙虛,我大天朝的碼農對這些概念那是相當熟悉啊!)這些概念有:

Directive(指令)
Controller(控制器)
Service (服務)

下面我們逐個來看這些概念,研究一下為什麼它們會像當初設計的那樣強大,同時研究一下為什麼我們要以那樣的方式去使用它們。我們從Service開始。

SERVICES(服務)

如果你已經使用過AngularJS,你可能已經遇到過Service這個概念了,簡而言之,Service就是【單例對象】在AngluarJS 中的一個別名。這些小東西(指單例對象)會被經常傳來傳去,保證你每次訪問到的都是同一個實例,這一點和工廠模式不同。基於這種思想,單例對象讓我們可以 實現一些相當酷的功能,它可以讓很多controller和directive訪問內部的數值。在#angularjs 頻道(譯者註:指的是原作者自己的博客頻道)裡面這也是非常常見的問題之一,那就是在應用中的不同代碼塊之間如何共享數據?我們來看這個問題。

我們首先來創建一個mole(模塊),本文中的所有代碼都會用到這個mole。
var mole = angular.mole( "my.new.mole",

下一步,我們來創建一個新的service(服務)。假設我們上面的這個mole是用來管理圖書的。所以,這里我們來創建一個Book service,然後把一個JSON對象數組添加到這個serice中,這些對象代表很多book數據。

mole.service( 'Book', [ '$rootScope', function( $rootScope ) {
var service = {
books: [
{ title: "Magician", author: "Raymond E. Feist" },
{ title: "The Hobbit", author: "J.R.R Tolkien" }
],

addBook: function ( book ) {
service.books.push( book );
$rootScope.$broadcast( 'books.update' );
}
}
return service;
}]);
這是一個非常簡單的service(有時候這樣就夠你用了)。我們這里正在做的事情就是在管理一個book 數組,同時還帶有一個addBook方法,在有需要的時候可以添加更多書籍。addBook方法還會在application上廣播一個事件,告訴所有正 在使用我們的service的人,數組已經被更新了,從而讓它們自己也做一些刷新操作。現在,我們要做的就是把這個service傳遞給各種 controller、directive、filter,或者其它任何需要它的東西---然後它們就可以訪問service中的這些方法和屬性了。好, 我們來動手。

var ctrl = [ '$scope', 'Book', function( scope, Book ) {
scope.$on( 'books.update', function( event ) {
scope.books = Book.books;
scope.$apply();//注意,原文這里少了這一行
});
scope.books = Book.books;
}];

mole.controller( "books.list", ctrl );

同樣非常簡單。我們上面所做的就是為我們的mole創建了一個新的controller。在創建的時候把$scope provdier和我們自己的Book service傳遞給了它。能明白我們在幹嘛嗎?我們把前面創建的Book service中的books數組賦給了controller內部的局部scope對象。
好,這里的核心問題是什麼呢?我們節省了一些時間,並且在controller上創建了一個數組。對---我們確實這樣做了。這樣做確實也為我們節 約了一點時間---但是如果我們要在其它地方處理這些書籍信息應該怎麼辦呢?通過scope來維護數據是非常粗暴的一種方式。由於其它 controller、directive、model的影響,scope很容易就會崩潰或者變臟。它很快就會變成一團亂麻。通過一種集中的途徑(在這里 就是service)來管理所有書籍數據,然後通過某種方式來請求修改它,這樣不僅僅會更加清晰---同時當應用的體積不斷增大的時候也更加容易管理。最 後,它還可以讓你的代碼保持模塊化(這也是Angular很擅長的一件事情)。一旦你在其它項目中需要用到這個service,你沒有必要在scope、 controller、filter等等東西裡面到處去查找相關的代碼,因為所有東西都在service裡面!

好。那麼我們什麼時候應該使用service呢?答案是:無論何時,當我們需要在不同的域中共享數據的時候。另外,多虧了Angular的依賴注入系統,實現這一點是很容易並且很清晰的。

CONTROLLERS(控制器)

我們再來看控制器!除非你曾經使用過前端MVC,否則從服務端MVC的思維模式轉向客戶端MVC的思維模式就如同一次腦筋急轉彎。為什麼會這樣呢? 這是因為,雖然在前端開發中controller實現了非常類似的功能,但是它同時還會實現一些與服務端controller非常不同的功能。在 Angular中,controller自身並不會處理"request",除非它是用來處理路由(route)的(很多人把這種方式叫做創建route controller---路由控制器),更明確地說,尤其是你的應用裡面那些作為界面的一部分的controller,它們只會管理非常小的一段代碼。

controller應該純粹地用來把service、依賴關系、以及其它對象串聯到一起,然後通過scope把它們關聯到view上。如果在你的 視圖裡面需要處理復雜的業務邏輯,那麼把它們放到controller裡面也是一個非常不錯的選擇。回到我們前面的這個books例子,我實際上並沒有什 么東西需要添加到controller裡面。

但是Kirk(譯者註:指本文原作者),如果我要add一本書籍應該怎麼辦呢?我應該在controller上面新增一個方法來處理這件事情嗎? 不,原因在下面解釋。因為它是DOM交互/操作的一部分。所以請把它放到directive(指令)裡面。怎麼做呢?很高興你能問出這個問題。

DIRECTIVES(指令)

到目前為止,在我們所編寫的大量AngularJS應用中,應用中最主要的復雜部分都在directive(指令)中。有一個強大的工具可以用來操 作和修改DOM,它也是我們這里需要討論的內容。我們來提供一個按鈕,用戶通過它可以向service裡面添加一本圖書,以這一功能來結束此文。

一個常見的反模式(按照本人愚見)是在controller裡面添加DOM交互代碼。Angular對directive的定義是一段代碼片段,你 可以用它來操作DOM,但是我覺得directive也是進行用戶交互的很好選擇。我們來擴展前面的例子,為用戶提供一個按鈕,通過這個按鈕可以向 service裡面添加一本書籍。

mole.directive( "addBookButton", [ 'Book', function( Book ) {
return {
restrict: "A",
link: function( scope, element, attrs ) {
element.bind( "click", function() {
Book.addBook( { title: "Star Wars", author: "George Lucas" } );
});
}
}
}]);

很簡單的東西。我們創建了一個指令,它的核心目的是簡單地向books列表中添加一本書籍,books已經注冊在了我們的Book服務中。我們來把這個指令應用到我們的視圖中。

<button add-book-button>Add book</button>

如你所見,我們僅僅把指令當作一個元素屬性來使用。每次點擊這個按鈕的時候,它都會把《Star Wars》(《星球大戰》)這本書添加到我們的Book service中去。簡單、輕松、模塊化---並且易復用。好了,我們為什麼不直接在控制器上面添加一個addBook之類的方法呢,比如說就像下面這 樣:

$scope.addBook = function() {
Book.addBook( { title: "Star Wars", author: "George Lucas" } );
};

這樣我們也能獲得同樣的結果,是的,確實如此---但是這樣做會帶來一個重大的問題。一旦我需要在其它地方添加書籍,我必須拷貝這份代碼(非 常un-DRY!)(譯者註:DRY---Dont Repeat Yourself,貌似是Ruby所倡導的一個重要的編碼原則。),或者進行重構(重構本身並不是什麼不好的的事情)。通過直接構建一個指令的方式,我們 以後就沒有必要擔心這種事情了---同時下次再需要實現相同功能的時候完全不需要花任何時間。通過構建指令的方式來進行DOM交互和修改,隨著業務需求的 不斷介入,我們就可以立即騰出手來處理復雜性不斷增加的應用了。這是相當不錯的一件事情,因為它保證了我們可以更少地和自己的實現打架,並且可以一直編寫 DRYer code。

Angular的模塊依賴哲學無疑讓它成為了一款非同凡響的框架。它讓我們能夠以這樣一種方式來編寫我們的前端代碼:我們不會干翻自己,也不會干翻框架---這可能是它最強大的力量。

javascript中如何實現單例模式

(function(){//自運行函數,初始化一些必要內容(也可叫封包)
varobj=null;//定義一個變數,保存實例對象
window.getObject=function(){//初始化外部介面好調用這個實例
if(obj===null){//如果實例為空就new一個實例並保存到obj
obj=new(function(){
varrows=0;
this.getRows=function(){
returnrows;
}
this.setRows=function(value){
rows=value;
}
})();
}
returnobj;//最後返回該實例
}
})();

調用如下:

getObject()

得到的對象有getRows和setRows兩個函數


可以先調用setRows更改該屬性值來判讀多次調用getObject得到的是不是同一對象

❹ 怎麼在angularjs的config中使用service

Angular中有幾種不同類型的services。每一種都有自己的獨特用法。

需要記住的非常重要的一點是service總是一個單體,無論是哪種類型的service。
注釋:單體是一種設計模式,它限制了每一個類僅能夠實例化為一個對象。無論我們在什麼地方注入我們的service,將永遠使用同一個實例。
例子:
app.constant('fooConfig',{
config1: true,
config2: "Default config2" });

Constant是一個非常有用的service,它經常被用來在指令中提供默認配置。因此如果你正在創建一個指令,並且你想要在給指令傳遞可選參數的同時進行一個默認配置,一個Constant就是一個好辦法。
作為一個constant,我們放入其中的值將不會改變。Contant service 基本上回事一個基本類型的值或者是一個對象。
例子:
app.value('fooConfig',{
config1: true,
config2: "Default config2 but it can change" });

一個value service有點像是一個constant但是它是可以被改變的。它也經常被用在一個指令上面,來進行配置。一個value service有點像是一個factory service的縮小版,它經常用來保存值但是我們不能在其中對值進行計算。
我們可以使用angular對象的extend方法來改變一個value service:
app = angular.mole("app", []);

app.controller('MainCtrl', function($scope, fooConfig) { $scope.fooConfig = fooConfig;
angular.extend(fooConfig, {config3: "I have been extended"});
});

app.value('fooConfig', {
config1: true,
config2: "Default config2 but it can changes" });
例子:
app.factory('foo', function() { var thisIsPrivate = "Private"; function getPrivate() { return thisIsPrivate;
} return {
variable: "This is public",
getPrivate: getPrivate
};
});
// or..
app.factory('bar', function(a) { return a * 2;
});

Factory service是最普遍使用的service。它同樣也非常容易理解。

一個Factory是一個能夠返回任何數據類型的service。對於你如何創建它並沒有什麼可選項,你僅僅需要在其中返回一些東西即可。

正如前面所說的,所有的service類型都是單體,因此如果我們在一個地方修改了foo.variable,其他的地方也會相應的發生改變。
例子:
app.service('foo', function() { var thisIsPrivate = "Private"; this.variable = "This is public"; this.getPrivate = function() { return thisIsPrivate;
};
});

Service service 和factory差不多。它們之間的區別在於service會接收一個構造器,因此當你第一次使用它的時候,它將會自動運行newFoo()來實例化一個對象。一定要記住如果你在其他的地方也使用了這個service,它將返回同一個對象。
事實上,上面的代碼和下面的代碼等價:
app.factory('foo2', function() { return new Foobar();
}); function Foobar() { var thisIsPrivate = "Private"; this.variable = "This is public"; this.getPrivate = function() { return thisIsPrivate;
};
}

Foobar是一個類,我們在首次使用它的時候在我們的factory中將它實例化然後將它返回。和service一樣,Foobar將只會實例化一次然後下次當我們再次使用factory時它將返回同一個實例。
如果我們已經有了一個類,並且我們想將它用在service中,我們只需要編寫如下的代碼:
app.service('foo3',Foobar);

Provider是factory的加強版。事實上,上一個例子中的factory代碼等價於下面的provider代碼:
app.provider('foo', function() { return { $get: function() { var thisIsPrivate = "Private"; function getPrivate() { return thisIsPrivate;
} return {
variable: "This is public",
getPrivate: getPrivate
};
}

};

});

一個provider中應當由一個$get函數,其中的內容就是我們想要注入我們應用中的部分,因此當我們將foo注入一個控制器時,我們實際上注入的是$get函數。
既然factory如此簡單,那我們為什麼還要使用provider呢?因為我們可以在config階段配置一個provider。因此我們可以編寫下面的代碼:
app.provider('foo', function() { var thisIsPrivate = "Private"; return {

setPrivate: function(newVal) { thisIsPrivate = newVal;
}, $get: function() { function getPrivate() { return thisIsPrivate;
} return {
variable: "This is public",
getPrivate: getPrivate
};
}

};

});

app.config(function(fooProvider) { fooProvider.setPrivate('New value from config');
});

在這里我們將thisIsPrivate移到了我們的$get函數的外面,然後我們創建了一個setPrivate來在一個config函數中修改thisIsPrivate。為什麼我們需要這樣做?這難道不比在factory中添加setter要容易嗎?除此之外,還有另外一個原因。

我們想要注入一個特定的對象但是我們想要提供一種方式來根據我們的需求進行一些配置。例如:一個service包含了一個使用jsonp的資源,我們想要配置具體使用的URL,或者我們想要使用一個第三方的service比如restangular來允許我們根據我們的需求來進行配置。

要注意到我們在config函數中放入的是nameProvider而不是name。在這里,我們實際上還是對name進行配置。

看到這里我們其實已經意識到了我們已經在應用中進行過一些配置了,像是$routeProvider以及$locationProvider,兩者分別用來配置我們的路由了html5模式。

那麼現在已經決定要使用前面的 foo service,但是其中還是缺少一個你想要的greet函數。你可以修改factory嗎?答案是不行!但是你可以裝飾它:
app.config(function($provide){ $provide.decorator('foo',function($delegate){ $delegate.greet = function(){ return "Hello, I am a new function of 'foo'";
}
});
});

$provide是Angular用來在內部創建我們的service的東西。如果我們想要使用它的話可以手動來使用它或者僅僅使用在我們的模塊中提供的函數(我們需要使用$provide來進行裝飾)。$provide有一個函數,decorator,它讓我們可以裝飾我們的service。它接收我們想要裝飾的service的名字並且在回調函數中接收一個$delegate來代表我們實際上的service實例。

在這里我們可以做一切我們想要的事情來裝飾我們的service。在上面的例子中,我們為我們原來的service添加了一個greet函數。接著我們返回了修改後的service。

經過修改以後,現在我們的factory中已經有了一個叫做greet的函數。

裝飾一個service的能力是非常實用的,尤其是當我們想要使用第三方的service時,此時我們不需要將代碼復制到我們的項目中,而只需要進行一些修改即可。

注意:constant service不能被裝飾。

我們的services都是單體但是我們可以創建一個單體factory來創建新的實例。在你深入之前,記住Angular中的服務都是單體並且我們不想改變這一點。但是,在極少數的情況下你需要生成一個新的實例,你可以像下面這樣做:
function Person(json){ angular.extend(this,json);
}

Person.prototype = {
update: function(){ this.name = "Dave"; this.country = "Canada";
}
};

Person.getById = function(id){ return new Person({
name: "Jesus",
country: "Spain" });
};
app.factory('personService',function(){ return {
getById: Person.getById
};
});

在這里我們創建了一個Person對象,它接收一些json數據來初始化對象。然後我們在我們的原型(原型中的函數可以被Person的實例所用)中創建了一個函數,並且在Person上直接創建了一個函數(就像是類函數一樣)。

因此現在我們擁有了一個類函數,它將基於我們提供的id來創建一個新的Person對象,並且每一個對象都可以自我更新。現在我們僅僅需要創建一個能夠使用它的service。

當每次我們調用personService.getById時,我們都在創建一個新的Person對象,因此你可以在不同的控制器中使用這個service,即便當factory是一個單體,它也能生成新的對象。

Service是Angular中最酷的特性之一。我們可以使用很多方法來創造它們,我們僅僅需要找到符合我們需求的方法然後實現它。

❺ JS單例模式

在面向對象語言中,調用一個類的方法之前,必須先將瞎鉛畢這個類實例化,才能調用類磨芹方法。

單例模式能使得我們不需要每次都需要實例化一次,因為我們使用的對象都是同一個對象。

單例模式:只允許實例化一次的對象類。

Leader返回一個包含getInstance方法的對象,執行這個方法可以獲得_mole的實例。

eader_01與leader_02完全相等,說明它們是同一個對象,並不是通過new新獲取的對象。

但是在多頁面情況下,通過import引入的並不是單例模式,因為激談

模態框彈窗的時候,不希望有兩個彈窗

閱讀全文

與js單例創建一個對象相關的資料

熱點內容
如何開啟筆記本電腦的無線網路 瀏覽:4
下列不屬於國家核心數據有哪些 瀏覽:771
雲幣網怎麼沒app 瀏覽:562
蘋果手機裝電腦系統怎麼安裝驅動程序 瀏覽:105
win10上的deg和rad和grad 瀏覽:499
iphone6s軟體更新好不好 瀏覽:726
jscheckboxdisabled 瀏覽:472
微信發送的圖片如何粘貼到文件 瀏覽:873
手機如何傳輸文件 瀏覽:200
華為手機微信怎麼沒有信息圖標 瀏覽:695
直徑120球形圓弧怎麼編程 瀏覽:339
word2003公式中 瀏覽:423
識鳥的app哪個好 瀏覽:876
phpjquery瀑布流代碼 瀏覽:849
如何更改無線網路設置 瀏覽:136
微信發紅包合法嗎 瀏覽:52
抖音年度可視化數據在哪裡生成 瀏覽:327
數據返回原頁怎麼保存 瀏覽:271
js單例創建一個對象 瀏覽:342
可刪除的手機文件在手機哪個窗口 瀏覽:354

友情鏈接