Переписать JS String Constructor: я уже в пути? - PullRequest
2 голосов
/ 08 октября 2010

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

Представьте, что конструктор String () не существует.Создайте функцию-конструктор MyString (), которая будет работать как String () настолько близко, насколько это возможно.Вам не разрешено использовать какие-либо встроенные строковые методы или свойства, и помните, что String () не существует.Вы можете использовать этот код для проверки вашего конструктора:

-

var s = new MyString ('hello');

s.length ();с [0];s.toString ();s.valueOf ();s.charAt (1);s.charAt ( '2');s.charAt ( 'е');s.concat («мир!»);s.slice (1,3);s.slice (0, -1);ДЕЛЕНИЕ ( 'е);ДЕЛЕНИЕ ( 'л');s.reverse ();

И вот мой ответ, который не сработал на одном или двух аккаунтах, но меня больше интересует его фактическая структура.Я полностью вне базы?Есть ли где-нибудь, где я могу просмотреть реальный конструктор String, реализованный браузерами, для сравнения?

function MyString(string){

    a = string.split("");

    this.length = a.length;

    this.toString = function(){
        return a.join("");
    };

    this.valueOf = function(){
        if(a.length > 0 && string !== 0 && string !== false && string !== undefined){
            return true;
        } else {
            return false;
        }
    };

    this.charAt = function(index){
        return a[index];
    };

    this.concat = function(addition){
        return string + addition;
    };

    this.slice = function(begin, end){
        var a2 = new Array();

        if(end < 0){
            end = parseInt(a.length) + end;
        }
        for(y = begin;y<end;y++){
            a2 += a[y];
        }

        return a2;
    };

    this.split = function(splitter){
        spPos = parseInt(a.indexOf(splitter));
        var split1 = a.slice(0,spPos);
        var split2 = a.slice(spPos + 1, a.length);
        var joined = new Array();
        return joined.concat(split1.join(""), split2.join(""));
    };

    this.reverse = function(){
        var ar = a.reverse();
        return ar.join("");
    };

    return this;
}

Я ухожу спать, но утром встану и отвечу.Большое спасибо за любые рекомендации, которые вы можете дать по этому вопросу.

Ответы [ 3 ]

2 голосов
/ 08 октября 2010

Краткий обзор структуры вашего класса, как упоминалось ранее.

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

function MyString(string){
    a = string.split("");
    this.length = a.length;
}

Ваши методы затем объявляются вне конструктора и поэтому не восстанавливаются каждый раз, когда создается новый экземпляр MyString.

MyString.prototype.toString = function(){ return a.join(""); }

MyString.prototype.charAt = function(index){ return a[index]; }
0 голосов
/ 04 ноября 2012

Я думаю, что ответ, помеченный как правильный, не совсем правильный.Если вы делаете:

var hello = new MyString('hello');
var bye = new MyString('bye');

hello.toString()  // returns "bye"

Может быть, решение может быть:

0 голосов
/ 08 октября 2010

Во-первых, браузеры обычно имеют реализацию String в некотором родном коде.Вы не сможете просматривать этот код.

Учитывая, что вы заинтересованы в улучшении своего кода, это нормально, если вы не делаете 'a' приватным, или, по крайней мере, можете иметь функцию, которая возвращаета.Это зависит от ваших требований в основном.Причина, по которой я спрашиваю, состоит в том, что очень важно отмечать количество функций, создаваемых при каждом вызове вашего конструктора.Чтобы избежать этого, вы должны переместить эти функции в прототип функции MyString, чтобы эти функции использовались всеми экземплярами MyString.Таким образом, вы не будете создавать несколько экземпляров одной и той же функции.Но опять же, это зависит от того, в порядке ли вы, позволяя «a» быть доступным вне функции (но в то же время это имеет огромное значение в количестве созданных объектов функции).

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