PaulBernier / castl

JavaScript to Lua compiler with runtime library.
GNU Lesser General Public License v3.0
372 stars 33 forks source link

How to setmetatable for an Object #21

Open lujiajing1126 opened 7 years ago

lujiajing1126 commented 7 years ago

I want override the default toString in both lua and js.

So normally I could do that in JavaScript with the Object.setPrototypeOf function, which finally call Object.defineProperty after babel-transformation, to change the proto chain .

However, I found that castl defines the Object.defineProperty with rawset, and also does not expose the setmetatable function.

So I'd like to ask how can I make use of the custom toString and __tostring in both lua and javascript

lujiajing1126 commented 7 years ago

An example code would be like this:

const util = require("util") // also as a custom runtime-lib for lua

const version = {
    major: 1,
    minor: 2,
    patch: 2
}

Object.setPrototypeOf(version, {
    toString() {
        return util.format("%d.%d.%d%s", this.major, this.minor, this.patch, this.pre_release ? this.pre_release : "")
    }
})

module.exports = {
    _NAME: "sample-project",
    _VERSION: "" + version,
    _VERSION_TABLE: version
}