可以在Javascript中使用方法链接来分配字符串吗?
我想使用JavaScript和AngularJS使用方法链接语法。我分配数组和字符串 此代码适用于:可以在Javascript中使用方法链接来分配字符串吗?,javascript,angularjs,variable-assignment,method-chaining,Javascript,Angularjs,Variable Assignment,Method Chaining,我想使用JavaScript和AngularJS使用方法链接语法。我分配数组和字符串 此代码适用于: $mdDateLocaleProvider .shortDays = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'] .msgCalendar = 'Calendario' ; 此代码不起作用: $mdDateLocaleProvider .shortDays = ['Do', 'Lu', 'Ma', 'Mi', 'Ju',
$mdDateLocaleProvider
.shortDays = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá']
.msgCalendar = 'Calendario'
;
此代码不起作用:
$mdDateLocaleProvider
.shortDays = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá']
.msgCalendar = 'Calendario'
.msgOpenCalendar = 'Abrir calendario'
;
我认为由于字符串赋值,msgOpenCalendar='Abrir calendario'语句失败
我的解决方案:
$mdDateLocaleProvider
.shortDays = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá']
.msgCalendar = 'Calendario'
;
$mdDateLocaleProvider
.msgOpenCalendar = 'Abrir calendario'
;
为什么分配字符串而不是数组时会出现问题?名称为方法链接出于某种原因,它用于链接方法,而不是变量分配 在方法链接中,您只需在方法(函数)的末尾返回对象实例(可变对象或新的不可变对象),这样您就可以“立即”调用下一个函数 它“工作”的原因是JS中的数组是一个对象,因此您只需在分配给
shortDays
属性的数组上放置msgCalendar
属性
基本上,你所取得的成就是:
var shortDays = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'].msgCalendar = 'Calendario';
// here shortDays actually equals to 'Calendario', because it is like writing a = b = 2.
$mdDateLocaleProvider.shortDays = shortDays;
$mdDateLocaleProvider.msgOpenCalendar = 'Abrir calendario';
不能像现在这样对直接赋值使用方法链接。正如罗恩所解释的,你认为它所做的并不是它实际上在做什么
解决这一问题的一种方法是实现,它允许您基于链接其setter方法来创建对象。您不能使用链接,但由于您在问题中包含了angularjs标记,您可能希望了解如何使用
angular.extend
:
angular.extend($mdDateLocaleProvider, {
shortDays: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'],
msgCalendar: 'Calendario',
msgOpenCalendar: 'Abrir calendario'
});
这将具有更新三个属性的预期效果,如果您想调用任何方法,甚至可以在结果上使用方法链接。您需要
Object.assign($mdDateLocaleProvider{
短日:['Do','Lu','Ma','Mi','Ju','Vi','Sá']
msgCalendar:“日历”
msgOpenCalendar:“Abrir calendario”
});
这会立刻为你安排好一切
如果你真的需要像设置
shortDays
,调用一个函数,然后设置msgCalendar
,试试我的垫片。当
assign
不起作用时(设置DOMonclick
s或innerText
s),或者您需要调用一个不连锁的函数时,这也会起作用。wrap($mdDateLocaleProvider)
.set('shortDays',['Do','Lu','Ma','Mi','Ju','Vi','Sá])
.set('msgCalendar','Calendario')
.set('msgOpenCalendar','Abrir calendario')
;
只需调用wrap()
就可以了
wrap=(obj)=>(Object.defineProperty(obj,
'define',{value:(名称,选项)=>(Object.defineProperty(obj,名称,选项))}
.define('assign',{value:(props)=>(Object.assign(obj,props))})
.define('set',{value:(名称,值)=>{obj[name]=value;返回obj;}})
.define('invoke',{value:(name,…args)=>{obj[name](…args);返回obj;}})
);
让bob={
您好:'那里',
链:()=>{bob.I_RAN=true;返回bob;},
doesnt:(arg1,arg2)=>{bob.I_RAN_还=[arg1,arg2];返回null;}
};
包裹(鲍勃)
.set(‘哦’、‘我的’)
.invoke('doesnt','works','anyway')
.assign({more:7,stuff:null})
;
for(让Object.keys的项(bob))
log(`${item}':${bob[item]}`);
输出:“此代码有效”-并非如您所想。我相信他真正实现的是
$mdDLP.shortDays='Calendario'
,阵列在过程中丢失。