Популярные шаблоны наследования JavaScript

Если вы декодируете печатаемую в кавычки с помощью кодировки UTF-8, вам нужно знать, что вы не можете декодировать каждую печатаемую в кавычки последовательность по одному, как другие показали, если есть серии печатных символов в кавычках вместе.

Например - если у вас есть следующая последовательность = E2 = 80 = 99 и декодируете ее, используя UTF8 по одному, вы получите три «странных» символа - если вместо этого вы создадите массив из трех байтов и преобразуете три байта с кодировкой UTF8 дают один апостроп.

Очевидно, что если вы используете кодировку ASCII, то поочередно проблем не возникает, однако выполнение декодирования означает, что ваш код будет работать независимо от используемого кодировщика текста.

Да, и не забывайте = 3D - это особый случай, который означает, что вам нужно декодировать все, что у вас есть еще раз ... Это сумасшедшая ошибка!

Надежда, которая помогает

16
задан Rob 29 October 2009 в 18:10
поделиться

2 ответа

I've got at least half a dozen implementations of various inheritance patterns lying around in my dev/web/stuff folder, but they are mostly toys.

What I actually sometimes use is the following thin wrapper over JavaScript's default pseudo-class-based approach to make inheritance easier:

Function.prototype.derive = (function() {
    function Dummy() {}
    return function() {
        Dummy.prototype = this.prototype;
        return new Dummy;
    };
})();

Example code:

function Pet(owner, type, name) {
    this.owner = owner;
    this.type = type;
    this.name = name;
}

Pet.prototype.toString = function() {
    return this.owner + '\'s ' + this.type + ' ' + this.name;
};

function Cat(owner, name) {
    Pet.call(this, owner, 'cat', name);
}

Cat.prototype = Pet.derive();

var souris = new Cat('Christoph', 'Souris');

Another interesting one is the following, which automatically adds factory methods to a proper prototypal approach:

var Proto = new (function() {
    function Dummy() {}

    this.clone = function() {
        Dummy.prototype = this;
        return new Dummy;
    };

    this.init = function() {};

    this.create = function() {
        var obj = this.clone();
        this.init.apply(obj, arguments);
        return obj;
    };
});

Example code:

var Pet = Proto.clone();

Pet.init = function(owner, type, name) {
    this.owner = owner;
    this.type = type;
    this.name = name;
};

Pet.toString = function() {
    return this.owner + '\'s ' + this.type + ' ' + this.name;
};

Cat = Pet.clone();

Cat.init = function(owner, name) {
    Pet.init.call(this, owner, 'cat', name);
};

// use factory method
var filou = Cat.create('Christoph', 'Filou');

// use cloning (the proper prototypal approach)
var red = filou.clone();
red.name = 'Red';

You've already seen my implementation of classes.

0
ответ дан 30 November 2019 в 23:14
поделиться

См. Как «правильно» создать пользовательский объект в JavaScript? для краткого описания. (Можно также связать его, так как я потратил столько времени на его написание!)

this:

Dog.prototype = new Animal ();

обычно следует избегать. Вы видите это в коде примера / учебника, но это ужасный беспорядок, потому что он основан на классе на экземпляре, а экземпляр построен неверным способом: имя не определено. Любой более сложный конструктор может расстроиться из-за таких вещей.

Object.prototype.inherit =

Это лучший подход для построения, но создание прототипа чего-либо в Объекте считается очень плохим вкусом. Это рискует испортить использование объектов как тривиальных карт и нарушить другой код. Вы можете поместить эту вспомогательную функцию в другое место, например. Function.prototype.subclass .

prototype.constructor

Лично я бы старался избегать, потому что конструктор имеет особое значение в JavaScript (как реализовано в Firefox и некоторых других браузеры, а не JScript IE), и это значение не имеет отношения к тому, что здесь делает конструктор , и не к тому, что вы ожидаете от любого такого свойства; это сбивает с толку, и его почти всегда лучше избегать. Поэтому, если включить ссылку на функцию-конструктор в экземпляр в системе классов, я бы предпочел назвать ее как-нибудь иначе.

Это рискует испортить использование объектов как тривиальных карт и нарушить другой код. Вы можете поместить эту вспомогательную функцию в другое место, например. Function.prototype.subclass .

prototype.constructor

Лично я бы старался избегать, потому что конструктор имеет особое значение в JavaScript (как реализовано в Firefox и некоторых других браузеры, а не JScript IE), и это значение не имеет отношения к тому, что здесь делает конструктор , и не к тому, что вы ожидаете от любого такого свойства; это сбивает с толку, и его почти всегда лучше избегать. Поэтому, если включить ссылку на функцию-конструктор в экземпляр в системе классов, я бы предпочел назвать ее как-нибудь иначе.

Это рискует испортить использование объектов как тривиальных карт и нарушить другой код. Вы можете поместить эту вспомогательную функцию в другое место, например. Function.prototype.subclass .

prototype.constructor

Лично я бы старался избегать, потому что конструктор имеет особое значение в JavaScript (как реализовано в Firefox и некоторых других браузеры, а не JScript IE), и это значение не соответствует тому, что здесь делает конструктор , и не тому, что вы ожидаете от любого такого свойства; это сбивает с толку, и его почти всегда лучше избегать. Поэтому, если включить ссылку на функцию-конструктор в экземпляр в системе классов, я бы предпочел назвать ее как-нибудь иначе.

prototype.constructor

Лично я бы старался избегать, потому что конструктор имеет особое значение в JavaScript (как реализовано в Firefox и некоторых других браузерах; не в IE JScript), и это значение не что здесь делает конструктор и что вы ожидаете от такого свойства; это сбивает с толку, и его почти всегда лучше избегать. Поэтому, если включить ссылку на функцию-конструктор в экземпляр в системе классов, я бы предпочел назвать ее как-нибудь иначе.

prototype.constructor

Лично я стараюсь избегать, потому что конструктор имеет особое значение в JavaScript (как реализовано в Firefox и некоторых других браузерах; не в IE JScript), и это значение не что здесь делает конструктор и что вы ожидаете от такого свойства; это сбивает с толку, и его почти всегда лучше избегать. Поэтому, если включить ссылку на функцию-конструктор в экземпляр в системе классов, я бы предпочел назвать ее как-нибудь иначе.

сбивает с толку и почти всегда лучше избегать. Поэтому, если включить ссылку на функцию-конструктор в экземпляр в системе классов, я бы предпочел назвать ее как-нибудь иначе.

сбивает с толку и почти всегда лучше избегать. Поэтому, если включить ссылку на функцию-конструктор в экземпляр в системе классов, я бы предпочел назвать ее как-нибудь иначе.

8
ответ дан 30 November 2019 в 23:14
поделиться
Другие вопросы по тегам:

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