簡體   English   中英

是否可以在 Javascript 中使用方法鏈分配字符串?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM