castl icon indicating copy to clipboard operation
castl copied to clipboard

How to setmetatable for an Object

Open lujiajing1126 opened this issue 7 years ago • 1 comments

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 avatar Jun 24 '17 08:06 lujiajing1126

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
}

lujiajing1126 avatar Jun 24 '17 08:06 lujiajing1126