Конструкторы в объектах JavaScript

Используйте pd.MultiIndex.from_product в качестве индекса в противном случае пустой фреймворк, а затем сбросьте его индекс, и все готово.

a = [1, 2, 3]
b = ["a", "b", "c"]

index = pd.MultiIndex.from_product([a, b], names = ["a", "b"])

pd.DataFrame(index = index).reset_index()

out:

   a  b
0  1  a
1  1  b
2  1  c
3  2  a
4  2  b
5  2  c
6  3  a
7  3  b
8  3  c
399
задан Ry- 25 May 2013 в 04:24
поделиться

2 ответа

Использование прототипов:

function Box(color) // Constructor
{
    this.color = color;
}

Box.prototype.getColor = function()
{
    return this.color;
};

Скрытие «цвета» (чем-то напоминает закрытый член переменная):

function Box(col)
{
   var color = col;

   this.getColor = function()
   {
       return color;
   };
}

Использование:

var blueBox = new Box("blue");
alert(blueBox.getColor()); // will alert blue

var greenBox = new Box("green");
alert(greenBox.getColor()); // will alert green
408
ответ дан 22 November 2019 в 23:38
поделиться

Вот шаблон, который я иногда использую для ООП-подобного поведения в JavaScript. Как видите, частные члены (как статические, так и экземпляры) можно моделировать с помощью замыканий. new MyClass () вернет объект со только свойствами, назначенными объекту this и в объекте прототипа класса.

var MyClass = (function () {
    // private static
    var nextId = 1;

    // constructor
    var cls = function () {
        // private
        var id = nextId++;
        var name = 'Unknown';

        // public (this instance only)
        this.get_id = function () { return id; };

        this.get_name = function () { return name; };
        this.set_name = function (value) {
            if (typeof value != 'string')
                throw 'Name must be a string';
            if (value.length < 2 || value.length > 20)
                throw 'Name must be 2-20 characters long.';
            name = value;
        };
    };

    // public static
    cls.get_nextId = function () {
        return nextId;
    };

    // public (shared across instances)
    cls.prototype = {
        announce: function () {
            alert('Hi there! My id is ' + this.get_id() + ' and my name is "' + this.get_name() + '"!\r\n' +
                  'The next fellow\'s id will be ' + MyClass.get_nextId() + '!');
        }
    };

    return cls;
})();

] Меня спросили о наследовании с использованием этого шаблона, так что вот:

// It's a good idea to have a utility class to wire up inheritance.
function inherit(cls, superCls) {
    // We use an intermediary empty constructor to create an
    // inheritance chain, because using the super class' constructor
    // might have side effects.
    var construct = function () {};
    construct.prototype = superCls.prototype;
    cls.prototype = new construct;
    cls.prototype.constructor = cls;
    cls.super = superCls;
}

var MyChildClass = (function () {
    // constructor
    var cls = function (surName) {
        // Call super constructor on this instance (any arguments
        // to the constructor would go after "this" in call(…)).
        this.constructor.super.call(this);

        // Shadowing instance properties is a little bit less
        // intuitive, but can be done:
        var getName = this.get_name;

        // public (this instance only)
        this.get_name = function () {
            return getName.call(this) + ' ' + surName;
        };
    };
    inherit(cls, MyClass); // <-- important!

    return cls;
})();

И пример использования всего этого:

var bob = new MyClass();
bob.set_name('Bob');
bob.announce(); // id is 1, name shows as "Bob"

var john = new MyChildClass('Doe');
john.set_name('John');
john.announce(); // id is 2, name shows as "John Doe"

alert(john instanceof MyClass); // true

Как вы можете видеть, классы правильно взаимодействуют друг с другом (у них общий статический идентификатор из MyClass , метод announce использует правильный метод get_name и т. Д.)

Следует отметить необходимость в теневом копировании свойств экземпляра. Фактически вы можете заставить функцию наследовать пройти через все свойства экземпляра (используя hasOwnProperty ), которые являются функциями, и автоматически добавить свойство super_ <имя метода> . Это позволит вам вызвать this.super_get_name () вместо того, чтобы сохранять его во временном значении и вызывать его привязанным с помощью call .

Для методов на прототипе вам не нужны Однако чтобы беспокоиться о вышеизложенном, если вы хотите получить доступ к методам прототипа суперкласса, вы можете просто вызвать this.constructor.super.prototype.methodName . Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)

имя метода> свойство . Это позволит вам вызвать this.super_get_name () вместо того, чтобы сохранять его во временном значении и вызывать его привязанным с помощью call .

Для методов на прототипе вам не нужны Однако чтобы беспокоиться о вышесказанном, если вы хотите получить доступ к методам прототипа суперкласса, вы можете просто вызвать this.constructor.super.prototype.methodName . Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)

имя метода> свойство . Это позволит вам вызвать this.super_get_name () вместо того, чтобы сохранять его во временном значении и вызывать его привязанным с помощью call .

Для методов на прототипе вам не нужны Однако чтобы беспокоиться о вышеизложенном, если вы хотите получить доступ к методам прототипа суперкласса, вы можете просто вызвать this.constructor.super.prototype.methodName . Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)

вы можете просто вызвать this.constructor.super.prototype.methodName . Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)

вы можете просто вызвать this.constructor.super.prototype.methodName . Если вы хотите сделать его менее подробным, вы, конечно, можете добавить удобные свойства. :)

248
ответ дан 22 November 2019 в 23:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: