请问:非组件脚本会在什么时候被实例化?

各位大佬们,小白讨教:

如果我没有理解错的话,
组件脚本相当于一个类模板,可以依附于一个节点上,并且在节点被创建的时候实例化。

那么 非组件脚本会在什么时候被实例化呢?
如果我在另一个脚本里require它,得到的是构造函数还是一个实例?
如果是实例,这个实例是唯一的吗,还是在require一次就新创建了一个?

(原谅我的愚蠢,因为C++习惯了对脚本语言真的不了解……)

比如我自己写一个计算几何的类Geometry,把它设置为module.exports,

module.exports = {

    ctor: function () {
        this.PI = Math.acos(-1);
    },

    dist: function (p1, p2) {
        return Math.sqrt((p2.x-p1.x)*(p2.x-p1.x) + (p2.y-p1.y)*(p2.y-p1.y));
    },
    
    func: function () {
        cc.log(this.PI);
        // ...
    }
    // ...
};

在另一个组件中我想用它,
var Geometry = require('geometry');
可是发现dist函数运行正常,但是func就不行,报错PI未定义,而且构造函数也没有被执行。

请大佬们指点。

如果是类,那你要手动实例化

你得到一个对象,这个对象就是 { ctor… dist… },不是一个类,也不是类的实例

require 得到的永远是唯一的

1赞

假如一个脚本未被添加到任何node上,它会在什么时候被执行呢?

我改成了这样:

// geometry.js
var Geometry = cc.Class({
    ctor () {
        this.PI = Math.acos(-1);
        cc.log('in ctor');
    },

    sayPI () {
        cc.log(this.PI);
    },
});

module.exports = new Geometry();

然后在另一个组件里:

var Geometry = require('geometry');

// ...

start () {
    Geometry.sayPI();
}

控制台:
CCDebugger.js:343
Can not find class ‘c6109Mx96FDiKQzF55keFxc’
(anonymous) @ CCDebugger.js:343

这个c6109Mx96FDiKQzF55keFxc是啥?

CCDebugger.js:343 Script attached to ‘geometry’ is missing or invalid.
(anonymous) @ CCDebugger.js:343

这又是什么意思?

geometry.js:10 3.141592653589793

竟然有正确的输出。。。

关注一波

抱歉,上述代码是正确的,警告是因为别的地方的错误。

但我还是很想知道非组件脚本是什么时候被实例化的?

var a=require(“xxx”)
var a1=new a()
a1.函数()

你什么时候调用的 new,就是在什么时候实例化
如果是 module.exports = new Geometry();,那就是在脚本加载时,也就是游戏一开始时就实例化