Javascript наследуется от массива и делает его глобальным - PullRequest
0 голосов
/ 03 сентября 2011

Небольшая демонстрация ниже иллюстрирует мою проблему:

// 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 ]

1 голос
/ 04 сентября 2011

Правильный подход заключается в создании псевдо-подклассифицированного конструктора 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/

1 голос
/ 03 сентября 2011

Ваш код, кажется, связывает глобальную переменную 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/

0 голосов
/ 03 сентября 2011

  1. Переместить определение класса перед вызовом.

    Примечание: Единственное, что действительно должно быть на первом месте, - это прототипирование, поскольку ваш код сначала назначает класс, но никогда не видит эффекта прототипирования, который происходит позже.,Ваше задание класса должно следовать за прототипами.

  2. Вы пропускаете ; после определения test2().

// 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();
0 голосов
/ 03 сентября 2011

Определите свой класс

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

Затем примените прототип массива

ClassA.prototype = Array.prototype;

Затем вы можете расширить свой класс

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

О части «Глобальная ссылка».В первой части вашего кода вы не делаете ссылку, вы создаете экземпляр класса, который еще не был определен на тот момент.Нет необходимости делать это тоже.Что вы думаете об этой части?

0 голосов
/ 03 сентября 2011

Попробуйте:

// 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. Создание объекта до расширения класса

0 голосов
/ 03 сентября 2011

swap

// 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, это язык сценариев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...