Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript原型继承和定义顺序_Javascript_Actionscript 3_Inheritance_Prototype - Fatal编程技术网

JavaScript原型继承和定义顺序

JavaScript原型继承和定义顺序,javascript,actionscript-3,inheritance,prototype,Javascript,Actionscript 3,Inheritance,Prototype,我正在开发一个ActionScript3.0到Javascript的转换器。 我试图找到一种绕过定义顺序问题的方法,因为在AS中,先定义哪个包并不重要。令我惊讶的是,以下代码可以工作,尽管A的原型是在BA从A继承之后定义的: javascript示例输出 今天我开始测试子类型,不幸的是,定义的顺序在这种情况下起了作用: javascript示例输出 我怎样才能避开这个问题?注意,我不会使用任何提供继承的库。 如果有人告诉我Actionscript 3.0是否支持相互导入/访问包,这将是一个

我正在开发一个ActionScript3.0到Javascript的转换器。 我试图找到一种绕过定义顺序问题的方法,因为在AS中,先定义哪个包并不重要。令我惊讶的是,以下代码可以工作,尽管A的原型是在BA从A继承之后定义的:

javascript示例输出

今天我开始测试子类型,不幸的是,定义的顺序在这种情况下起了作用:

javascript示例输出

我怎样才能避开这个问题?注意,我不会使用任何提供继承的库。 如果有人告诉我Actionscript 3.0是否支持相互导入/访问包,这将是一个很大的帮助,例如: 动作脚本

谢谢。
Uli

你为什么不拿一个现有的呢?因为他们要么在做同样的事情,要么在用for-in复制原型。
Function.prototype.inherit = function(base) {
   var empty = Function.prototype.inherit.empty;
   empty.prototype = base.prototype;
   this.prototype = new empty();
}
Function.prototype.inherit.empty = function() {};

//order doesn't matter
(function(undefined) {
   function BA() {}
   BA.inherit(A);
   BA.prototype.f1 = function() { return "success"; }

   function A() {}
   A.prototype.f1 = function() { return "fail"; }
   A.prototype.f2 = function() { return "success"; }

   var bA = new BA;
   console.log("test1: %s; %s", bA.f1(), bA.f2());
   console.assert(bA instanceof BA);
   console.assert(bA instanceof A);
})();

//order plays a decisive role
(function(undefined) {
   function CBA() {}
   CBA.inherit(BA);
   CBA.prototype.constructor = CBA;
   CBA.prototype.f3 = function() { return "success"; }

   function BA() {}
   BA.inherit(A);
   BA.prototype.constructor = BA;
   BA.prototype.f1 = function() { return "success"; }

   function A() {}
   A.prototype.f1 = function() { return "fail"; }
   A.prototype.f2 = function() { return "success"; }

   var cBA = new CBA;
   //this won't work. The compiler claims that cBA.f1 is not a function
   console.log("test2: %s; %s, %s", cBA.f1(), cBA.f2(), cBA.f3());
})();

package my.pkg1 {
   class A {
   }
   class B extends my.pkg2.C {
   }
package my.pkg2 {
   class C {
   }
   class D extends my.pkg1.A {
   }
}