Javascript继承自数组并使其全局化

时间:2011-09-03 14:33:00

标签: javascript inheritance object function-prototypes

下面的小演示说明了我的问题:

// 1 - Define a global reference to classA
(function() {
    window.classA = new ClassA();
})();

// 2 - ClassA object definition
function ClassA() {
    this.test1 = function() {
        document.write('test1');
    };
}

// 3 - ClassA inherits Array and has a test function
ClassA.prototype = new Array;
ClassA.prototype.test2 = function() {
    document.write(this[0]);
}

// 4 - Test our ClassA
var c = new ClassA();
c.test1();
c.push('test2');
c.test2();

// 5 - Test our global ClassA
classA.test1();
classA.push('test2'); // doesn't work
classA.test2(); // doesn't work

在此处试试:http://jsfiddle.net/SPSW4/

定义全局变量classA(ClassA实例)的正确方法是什么?

6 个答案:

答案 0 :(得分:1)

classA完全定义之前,您的代码似乎绑定了全局ClassA变量。如果你这样做,我相信你会有更多的运气:

// 1 - define ClassA 
window.ClassA = function() {
    this.test1 = function() {
        document.write('test1');
    };
};
ClassA.prototype = new Array;
ClassA.prototype.test2 = function() {
    document.write(this[0]);
}

// 2 - Define a global reference to classA
window.classA = new ClassA();

// 3 - Test our ClassA
var c = new ClassA();
c.test1();
c.push('test2');
c.test2();

// 4 - Test our global ClassA
classA.test1();
classA.push('test2'); // doesn't work
classA.test2(); // doesn't work

以下是一个示例:http://jsfiddle.net/SPSW4/2/

答案 1 :(得分:1)

正确的方法是在立即调用的函数表达式中创建伪子类Array构造函数,然后将结果公开给显式全局对象。

(function( global ) {
    // Declare the ArrayLike constructor
    function ArrayLike() {
        var args = [].slice.call( arguments ), 
            length = args.length, i = 0;

        this.length = length;

        for ( ; i < length; i++ ) {
            this[ i ] = args[ i ];
        }
        return this;
    }
    // Define ArrayLike's prototype by creating a new Array instance
    ArrayLike.prototype = new Array();

    // Define your own proto method
    ArrayLike.prototype.firstChar = function() {
        var ret = [], 
            length = this.length, i = 0;

        for ( ; i < length; i++ ) {
            ret[ i ] = this[ i ][ 0 ];
        }
        return ret;
    };
    // Expose the ArrayLike constructor.
    global.ArrayLike = ArrayLike;
})( this );

var a = new ArrayLike( "alpha", "beta", "gamma" );

console.log( a.push("delta") ) // 4
console.log( a ); // ["alpha", "beta", "gamma", "delta"]
console.log( a.firstChar() ); // ["a", "b", "g", "d"]

现场直播:http://jsfiddle.net/rwaldron/gLdkb/

答案 2 :(得分:0)

<强>交换

// 2 - ClassA object definition
function ClassA() {
    this.test1 = function() {
        document.write('test1');
    };
}

// 1 - Define a global reference to classA
(function() {
    window.classA = new ClassA();
})();

声明之前在JavaScript中调用函数,它是一种脚本语言。

答案 3 :(得分:0)

试试这个:

// 2 - ClassA object definition
function ClassA() {
    this.test1 = function() {
        document.write('test1');
    };
}


// 3 - ClassA inherits Array and has a test function
ClassA.prototype = new Array;
ClassA.prototype.test2 = function() {
    document.write(this[0]);
}

// 4 - Test our ClassA
var c = new ClassA();
c.test1();
c.push('test2');
c.test2();

// 1 - Define a global reference to classA
window.classA = new ClassA();

// 5 - Test our global ClassA
classA.test1();
classA.push('test2');
classA.test2();

实际上有两个问题: 1.在声明类之前创建对象 2.在扩展类

之前创建对象

答案 4 :(得分:0)

定义您的课程

ClassA = function()
{
    this.test1 = function()
    {
        document.write('test1');
    };
};

然后应用数组原型

ClassA.prototype = Array.prototype;

然后你可以扩展你的课程

ClassA.prototype.test2 = function()
{
    document.write(this[0]);
};

关于“全球参考”部分。在代码的第一部分中,您没有参考,您正在实现一个尚未定义的类。也没有必要这样做。你对那部分有什么看法?

答案 5 :(得分:0)


  1. 在调用之前移动类定义。

    注意:唯一真正需要的是原型,因为您的代码首先分配类,但从未看到原型的影响,后者会在稍后发生。您的课程作业应该在原型之后。

  2. 您在;定义后遗漏了test2()


  3. // Class Definition
    function ClassA() {
       this.test1 = function() { document.write('foo'); };
    }
       ClassA.prototype       = new Array();
       ClassA.prototype.test2 = function() { document.write(this[0]); };
    
    
    // Init
    (function() { 
       window.classA = new ClassA(); 
    })();
    
    // Method Calls
    var c = new ClassA();
        c.test1();
        c.push('bar');
        c.test2();
    
    classA.test1();
    classA.push('bar');
    classA.test2();