Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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_Oop_Class - Fatal编程技术网

用javascript扩展类

用javascript扩展类,javascript,oop,class,Javascript,Oop,Class,我用js编写了两个几乎相同的类。我想让其中一个扩展另一个,以减少代码。我是javascript的新手,我需要一些帮助来实现这一点。 我在这里发布课程。有人能帮忙吗 //============================================================================================================================================ //Class1=========

我用js编写了两个几乎相同的类。我想让其中一个扩展另一个,以减少代码。我是javascript的新手,我需要一些帮助来实现这一点。 我在这里发布课程。有人能帮忙吗

//============================================================================================================================================
        //Class1==================================================================================================================================
        //============================================================================================================================================
        function Class1(config){
            var targetObj;
            var copycanvas = null;
            var copy = null;
            var outputcanvas = null;
            var draw = null;
            var direction = config.direction || "lr";

            var TILE_WIDTH = config.tileWidth || 100;
            var TILE_HEIGHT = config.tileHeight || 100;

            var SOURCERECT = {x:0, y:0, width:0, height:0};
            var interval;
            var tiles2 = [];
            var cols = 0;
            var rows = 0;

            createTiles = function(){
                tiles = [];     
                tiles2 = [];        

                var y=0;
                while(y < SOURCERECT.height){
                    var x=0;
                    cols = 0;
                    while(x < SOURCERECT.width){                            
                        cols++;
                        x += TILE_WIDTH;
                    }
                    rows++;
                    y += TILE_HEIGHT;
                }

                var i, j;
                if (direction == "tl"){
                    for (i = 0; i < rows; i++)
                        for (j = 0; j < cols; j++){
                            x = j * TILE_WIDTH;
                            y = i * TILE_HEIGHT;
                            var tile = new Tile();
                            tile.imageX = x;
                            tile.imageY = y;
                            tiles2.push(tile);
                        }
                }
                arrangeSquares();
            };

            arrangeSquares = function(){
                var i, j, k;
                var M, N;

                M = rows;
                N = cols;
                i = j = 0;
                var cnt = 0;
                for (i = 0; i < N + M - 1; i++)
                    for (j = 0; j <= i; j++) 
                        if (j < M && (i - j) < N){
                            tiles.push(tiles2[j * N + (i - j)]);
                        }   
            }

            processFrame = function(){  
                copycanvas.width = outputcanvas.width = targetObj.width;
                copycanvas.height = outputcanvas.height = targetObj.height;
                copy.drawImage(targetObj, 0, 0, targetObj.width, targetObj.height);

                for(var i=0; i < tiles.length; i++) {
                    var tile = tiles[i];

                    tile.alpha += 0.05;

                    var TH  = Math.max(0, Math.min(TILE_HEIGHT, targetObj.height - tile.imageY));
                    var TW  = Math.max(0, Math.min(TILE_WIDTH, targetObj.width - tile.imageX));                 

                    draw.save();
                    draw.translate(tile.imageX, tile.imageY);   
                    draw.globalAlpha = Math.max(0, tile.alpha);         

                    draw.drawImage(copycanvas, tile.imageX, tile.imageY, TW, TH, 0, 0, TW, TH);         
                    draw.restore();
                }

                var ok = true;
                for (i = 0; i < tiles.length; i++) {
                    if (tiles[i].alpha < 1) { 
                        ok = false;
                        break;
                    }
                }
                if (ok)
                {
                    clearInterval(interval);
                    showComplete();

                }
            };

            function showComplete() {
                $target.trigger("showComplete");

                $img.show();
                $(copycanvas).remove();
                $(outputcanvas).remove();
                if ($hideTarget)
                    $hideTarget.hide();
            };

            this.hide = function(target) {

            };
            var $target = null;
            var $img = null;
            var $hideTarget = null;
            this.show = function(target, hideTarget){
                $target = $("#" + target).show();

                align($target);

                if (hideTarget != undefined) {
                    $target.before($hideTarget = $("#" + hideTarget).show());
                    align($hideTarget);
                }

                $img = $("#" + target + " > img").filter(":first").hide();

                $("<canvas/>").attr("id", "sourcecopy")
                              .css("position", "absolute")
                              .appendTo($target)
                              .hide();
                copycanvas = document.getElementById("sourcecopy");
                copy = copycanvas.getContext('2d');

                $("<canvas/>").attr("id", "output")
                              .css("position", "absolute")
                              .appendTo($target);
                outputcanvas = document.getElementById("output");
                draw = outputcanvas.getContext('2d');

                targetObj = document.getElementById($img.attr("id"));

                clearInterval(interval);

                SOURCERECT = {x:0, y:0, width: targetObj.width, height: targetObj.height};
                createTiles();

                for(var i=0; i<tiles.length; i++){
                    var tile = tiles[i];
                    tile.alpha = 0 - (i * (2 / tiles.length));
                }

                var intervalDelay = (config.duration * 1000) / (40 + rows + cols);
                interval = setInterval(function() { processFrame(); }, intervalDelay);  
            };

            function Tile(){
                this.alpha = 1; 
                this.imageX = 0;
                this.imageY = 0;
            };
        };

        //============================================================================================================================================
        //Class2===================================================================================================================================
        //============================================================================================================================================
        function Class2(config){
            var targetObj;
            var copycanvas = null;
            var copy = null;
            var outputcanvas = null;
            var draw = null;
            var direction = config.direction || "lr";

            var TILE_WIDTH = config.barWidth || 50;
            var TILE_HEIGHT = 100;

            var SOURCERECT = {x:0, y:0, width:0, height:0};
            var interval;
            var tiles = [];

            createTiles = function(){
                tiles = [];             
                var y=0;
                while(y < SOURCERECT.height){
                    var x=0;
                    while(x < SOURCERECT.width){
                        var tile = new Tile();
                        tile.imageX = x;
                        tile.imageY = y;
                        tiles.push(tile);
                        x += TILE_WIDTH;
                    }
                    y += TILE_HEIGHT;
                }
            };

            processFrame = function(){  
                copycanvas.width = outputcanvas.width = targetObj.width;
                copycanvas.height = outputcanvas.height = targetObj.height;
                copy.drawImage(targetObj, 0, 0, targetObj.width, targetObj.height);

                for(var i=0; i < tiles.length; i++) {
                    var tile = tiles[i];

                    tile.alpha += 0.05;

                    var TH  = Math.max(0, Math.min(TILE_HEIGHT, targetObj.height - tile.imageY));
                    var TW  = Math.max(0, Math.min(TILE_WIDTH, targetObj.width - tile.imageX));                 

                    draw.save();
                    draw.translate(tile.imageX, tile.imageY);   
                    draw.globalAlpha = Math.max(0, tile.alpha);         
                    draw.drawImage(copycanvas, tile.imageX, tile.imageY, TW, TH, 0, 0, TW, TH); 
                    draw.restore();
                }

                var ok = true;
                for (i = 0; i < tiles.length; i++) {
                    if (tiles[i].alpha < 1) { 
                        ok = false;
                        break;
                    }
                }
                if (ok)
                {
                    clearInterval(interval);
                    showComplete();
                }

            };

            function showComplete() {
                $target.trigger("showComplete");

                $img.show();
                $(copycanvas).remove();
                $(outputcanvas).remove();
                if ($hideTarget)
                    $hideTarget.hide();
            };

            this.hide = function(target) {

            };
            var $target = null;
            var $img = null;
            var $hideTarget = null;
            this.show = function(target, hideTarget){
                $target = $("#" + target).show();

                align($target);

                if (hideTarget != undefined) {
                    $target.before($hideTarget = $("#" + hideTarget).show());
                    align($hideTarget);
                }
                $img = $("#" + target + " > img").filter(":first").hide();

                $("<canvas/>").attr("id", "sourcecopy")
                              .css("position", "absolute")
                              .appendTo($target)
                              .hide();
                copycanvas = document.getElementById("sourcecopy");
                copy = copycanvas.getContext('2d');

                $("<canvas/>").attr("id", "output")
                              .css("position", "absolute")
                              .appendTo($target);
                outputcanvas = document.getElementById("output");
                draw = outputcanvas.getContext('2d');

                targetObj = document.getElementById($img.attr("id"));

                clearInterval(interval);

                if (direction == "tb" || direction == "bt")
                {
                    TILE_WIDTH = targetObj.width;
                    TILE_HEIGHT = config.barWidth;
                }
                else 
                {
                    TILE_WIDTH = config.barWidth;
                    TILE_HEIGHT = targetObj.height;         
                }

                SOURCERECT = {x:0, y:0, width: targetObj.width, height: targetObj.height};
                createTiles();

                if (direction == "lr" || direction == "tb")
                {
                    for(var i=0; i<tiles.length; i++){
                        var tile = tiles[i];
                        tile.alpha = 0 - (i * (1 / tiles.length));
                    }
                }
                else
                {
                    for(var i=tiles.length - 1; i >= 0 ; i--){
                        var tile = tiles[i];
                        tile.alpha = 0 - ((tiles.length - i - 1) * (2 / tiles.length));
                    }
                }

                var intervalDelay = (config.duration * 1000) / (40 + tiles.length);
                interval = setInterval(function() { processFrame(); }, intervalDelay);  
            };

            function Tile(){
                this.alpha = 1; 
                this.imageX = 0;
                this.imageY = 0;
            };
        };
//============================================================================================================================================
//第一类==================================================================================================================================
//============================================================================================================================================
功能类别1(配置){
var-targetObj;
var copycanvas=null;
var copy=null;
var outputcanvas=null;
var-draw=null;
var direction=config.direction | |“lr”;
var TILE_WIDTH=config.tileWidth | | 100;
var TILE|u HEIGHT=config.tileHeight | | 100;
var SOURCERECT={x:0,y:0,宽度:0,高度:0};
var区间;
var tiles2=[];
var-cols=0;
var行=0;
createTiles=函数(){
瓷砖=[];
tiles2=[];
var y=0;
而(y<源矩形高度){
var x=0;
cols=0;
而(x对于(j=0;j请尝试这样声明类

var theClass = function theClass() {
   ....
要扩展此类,可以使用prototype方法:

theClass.prototype.newMethodName = function () {
   ....

尝试这样声明类

var theClass = function theClass() {
   ....
要扩展此类,可以使用prototype方法:

theClass.prototype.newMethodName = function () {
   ....

您有两个选择。您可以将通用功能隔离到第三个对象中,该对象
Class1
Class2
共享(聚合),或者您可以实际创建对象的层次结构(继承)。我将在这里讨论继承

JavaScript没有类,它是一种原型语言。一个对象实例由一个原型对象“支持”。如果你向该实例请求一个它没有的属性(并且函数作为属性附加到对象),JavaScript解释器会检查对象后面的原型,看它是否有该属性(如果不是,则是该对象背后的原型,等等)。这就是原型继承的工作原理

JavaScript是一种不同寻常的原型语言,因为直到最近,还没有办法直接创建对象并分配其原型;您必须通过构造函数来完成。如果您使用基于类的术语,您可能会更习惯于使用构造函数。:-)

下面是一个基本的继承设置(我实际上不会这样做,下面将详细介绍):

现在我们可以使用
汽车
,获得
汽车
的功能:

var c = new Car("T.J.");
alert(c.getOwner()); // "T.J.", retrived via Vehicle.prototype.getOwner
上面这一点有点尴尬,而且在事情发生的时候会有一些棘手的问题。还有一个问题是,大多数函数都是匿名的,我不喜欢匿名函数(函数名)。如果你还有一个函数的副本(例如“超级调用”),调用你的原型版本的函数也会很尴尬-对于层次结构来说,这不是一种罕见的操作)。因此,您会看到许多用于构建层次结构的“框架”,通常使用基于类的术语。下面列出了其中一些框架:

  • 通用JavaScript库的
    功能
  • 迪安·爱德华兹学院
  • John Resig(Resig是创建jQuery的人)
  • 呃,嗯,-据我所知,大约有三个人在使用它。我这样做是因为我对上面的每一个决定都有疑问。我将更新它,使其不使用类术语(并将其作为一个小型库发布,而不仅仅是一篇博客文章),因为这些都没有向JavaScript中添加类,而且它们的行为似乎忽略了JavaScript原型模型的要点
在这四种情况中,我推荐Resig或我的。Resig使用函数反编译(在函数实例上调用
toString
,这从未被标准化过,在某些平台上不起作用),但即使函数反编译不起作用,它也能起作用,在这种情况下,它的效率略低

不过,在开始讨论这些问题之前,我鼓励您先看看道格拉斯·克罗克福德(Douglas Crockford,因JSON而出名,也是YUI的大人物)所倡导的方法。克罗克福德对这个方法和他的一些想法(最著名的是
Object.create
)现在是最新标准的一部分,并且正在进入浏览器。使用
Object.create
,您可以直接将原型分配给对象,而无需构造函数

对于需要继承的地方,我更喜欢构造函数(在语法帮助下)