[英]Is it possible to use method chaining assigning strings in Javascript?
我想使用 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數組是一個對象,所以你只需放置一個msgCalendar
您分配到陣列中財產shortDays
財產。
基本上,你取得的是:
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';
你不能像你正在做的那樣使用直接賦值的方法鏈。 正如 Ron 所解釋的,你認為它所做的並不是它實際在做的。
解決此問題的一種方法是實現Builder 模式,該模式允許您基於鏈接它們的 setter 方法來創建對象。
您不能使用鏈接,但是當您在問題中包含 angularjs 標簽時,您可能想要查看使用angular.extend
:
angular.extend($mdDateLocaleProvider, {
shortDays: ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'],
msgCalendar: 'Calendario',
msgOpenCalendar: 'Abrir calendario'
});
這將具有更新三個屬性的預期效果,如果您想調用任何方法,您甚至可以對結果使用方法鏈。
你想要assign()
。
Object.assign($mdDateLocaleProvider, {
shortDays : ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá']
msgCalendar : 'Calendario'
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:(name, options) => (Object.defineProperty(obj, name, options))})
.define('assign', {value:(props) => (Object.assign(obj, props)) })
.define('set' , {value:(name, value) => { obj[name] = value; return obj; } })
.define('invoke', {value:(name, ...args) => { obj[name](...args); return obj; } })
);
let bob = {
hello : 'there',
chains : () => {bob.I_RAN = true; return bob;},
doesnt : (arg1, arg2) => {bob.I_RAN_ALSO = [arg1, arg2]; return null;}
};
wrap(bob)
.set('oh', 'my')
.chains()
.invoke('doesnt', 'works', 'anyway')
.assign({more:7, stuff:null})
;
for (let item of Object.keys(bob))
console.log(`'${item}' : ${bob[item]}`);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.