CCCA wiki

交通大學校園電腦社群策進會

使用者工具

網站工具


側欄

側邊欄

playground:fake-literal-namespace

fake literal namespace

在玩 xml-rpc 時想到的有趣寫法。 一般 xmlrpc 把呼叫以類似 java 的 . 命名空間表示, 像 xmlrpc.call('dokuwiki.appendPage', page, wikiText) 1)

但多數函式庫中,命名空間只能以字串形式傳入, 如果用 proxy 實作,也許可以用字面量傳入? 像 fakeNamespace.build().dokuwiki.appendPage(page, wikiText)fakeNamespace.$.dokuwiki.appendPage(page, wikiText)

更直觀的寫法:

var dokuwiki = fakeNamespace.build('dokuwiki')
dokuwiki.appendPage('start', 'this is comment')
 
fakeNamespace.$.dokuwiki.appendPage('start', 'this is comment')
 
var server = fakeNamespace.build()
server.dokuwiki.appendPage('start', 'this is comment')
fake-namespace.js
var fakeNamespace = {
    append(parent, subname) {
        const name = parent.path + '.' + subname
        return this.create(name)
    },
    create(name) {
        const f = function () {}
        f.path = name
        return f
    },
    wrap(real) {
        return new Proxy(real, {
            get: (real, name) => this.wrap(this.append(real, name)),
            apply: (real, that, argv) => this.callApi(real, ...argv)
        })
    },
    get $() { return this.build() },
    build(name) {
        if (name) return this.wrap(this.create(name))
        else return new Proxy({}, {
            get: (_, name) => this.wrap(this.create(name))
        })
    },
    callApi(real, ...argv) {
        return {name: real.path, argv}
    }
}
playground/fake-literal-namespace.txt · 上一次變更: 2019/12/31 00:16 由 gold holk