区别一:value可以被修改,constant一旦声明无法被修改
$provide.decorator('pageCount', function($delegate) { return $delegate + 1; });
区别二:value不可在config里注入,constant可以
var app = angular.module('app', []);
app.value('myValue', 1);
app.value('myConstant', 1);
// 正确
app.config(config);
myConfig.$inject = ['myConstant'];
function myConfig(myConstant) {
}
// 错误
app.config(config);
myConfig.$inject = ['myValue'];
function myConfig(myValue) {
}
`
透过源码看原理
function provider(name, provider_) {
if (isFunction(provider_)) {
provider_ = providerInjector.instantiate(provider_);
}
if (!provider_.$get) {
throw Error('Provider ' + name + ' must define $get factory method.');
}
return providerCache[name + providerSuffix] = provider_;
}
function factory(name, factoryFn) {
return provider(name, {
$get: factoryFn
});
}
function service(name, constructor) {
return factory(name, ['$injector', function($injector) {
return $injector.instantiate(constructor);
}]);
}
function value(name, value) {
return factory(name, valueFn(value));
}
function constant(name, value) {
providerCache[name] = value;
instanceCache[name] = value;
}
function decorator(serviceName, decorFn) {
var origProvider = providerInjector.get(serviceName + providerSuffix),
orig$get = origProvider.$get;
origProvider.$get = function() {
var origInstance = instanceInjector.invoke(orig$get, origProvider);
return instanceInjector.invoke(decorFn, null, {
$delegate: origInstance
});
};
}
参考