jsb脚本出错位置不明确

会,但是es6我一点都不了解:joy:所以无法帮到你

哈罗,经过验证,只要 ES6 有继承,模拟器就会有这个报错!看来 Babel 的实现还是不够优化啊!建议你通过

function base {

}

function sub {

}

cc.js.extend(sub, base);

的方式实现 JS 的原生继承,或者直接使用 CCClass 实现继承。至于报错信息,我们会继续完善!

我现在是服务端和客户端都共享同一个文件,所以不太想改成以上的继承模式,所以问两个问题:
1.出错信息里所说的性能会很差(用这种模式),是不是真的。

2.以后会不会修复这个问题。

因为如果只是暂时的,那我可以无视这个信息,如果无法修复,那我就只能把服务端和客户端的代码都改成没有语法糖的方式了。

要我用cc.js.extend的话不太现实,毕竟服务端没有cc。

能给个确定的信息吗?我这边好改程序.

这是 SpiderMonkey 给的提示,你可以测试下,具体我也不太清楚,V8 和 Chrome 应该没这个问题。

这是 Babel 引起的,要看之后它的版本会不会改进继承的实现方式,不过估计可能性不大

你可以把源码里的那个 extend 方法复制出来单独使用,你也可以用其它任何方法实现继承。JS 的继承写法网上非常多。

谢谢,以前一直是用的网上找的写法,那天看cc和nodejs都支持es6了,想着用标准写法会兼容一些,就都改成了es6的class,改得要死,没想到又要改回去,晕死。

又把这个贴挖出来了,因为昨天才看到arguments.callee性能低下,而且不能用在严格模式下面。而我现在的class实现方式是下面这样的:
//定义最顶级类
function Class() {}
Class.prototype.init = function() {};
Class.extend = function(def) {
var classDef = function() {
if (arguments[0] !== Class) {
this.init.apply(this, arguments);
}
};

var proto = new this(Class);
var superClass = this.prototype;

for (var n in def) {
    var item = def[n];
    if (item instanceof Function) item.$ = superClass;
    proto[n] = item;
}

classDef.prototype = proto;

//赋给这个新的子类同样的静态extend方法 
classDef.extend = this.extend;
return classDef;

};
exports.Class = Class;

getName: function() {
    //调用BaseClass的getName()方法
    return "SubClass(" + this.getId() + ") extends " +
        arguments.callee.$.getName.call(this);
},

子类里调用父类的方法必须要用到arguments.callee,这样就没法用这个class去定义类了。
你说可以把extend方法复制出来,我是没法找到这个方法,cc.js.extend,能不能麻烦你指一下在哪里,我不熟悉creator的源码。

或者你告诉我一个简单点的能定义类的方法也可以,不过子类要能调用父类的方法。

最麻烦就是不能用es6的原生class定义,能用就最好了,毕竟兼容性最好,不太懂babel在creator里面的作用,不明白为什么原生的es6关键字都不能用,这样对以后的兼容好吗?

https://github.com/cocos-creator/engine/blob/master/cocos2d/core/platform/js.js#L140-155

CCClass 不就行了吗?子类调用父类方法时只要 this._super();

请参考 http://www.cocos.com/docs/creator/scripting/reference/javascript-support.html 不是说不能用,而是用了以后很多浏览器和模拟器不支持,所以 Creator 采用 babel 来兼容。至于 es6 的继承问题,应该是 babel 在实现上不够完美的地方。