可以在Javascript中使用方法链接来分配字符串吗?

可以在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',

我想使用JavaScript和AngularJS使用方法链接语法。我分配数组和字符串

此代码适用于:

$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
不起作用时(设置DOM
onclick
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'
,阵列在过程中丢失。