Я долговременный браузер, но первый участник. Если мне не хватает информации об этикетах, просто сообщите мне!
Кроме того, я искал высокий и низкий, включая этот сайт, но я не нашел четкого и краткого объяснения того, что я ищу. Если я просто пропустил это, пожалуйста, укажите мне в правильном направлении!
Хорошо, я хочу расширить некоторые собственные объекты JavaScript, такие как Array и String. Однако я не хочу их расширять, но создавать новые объекты, которые наследуют их, а затем изменять их.
Для массива это работает:
var myArray = function (n){
this.push(n);
this.a = function (){
alert(this[0]);
};
}
myArray.prototype = Array.prototype;
var x = new myArray("foo");
x.a();
Однако для String то же самое не работает:
var myString = function (n){
this = n;
this.a = function (){
alert(this);
};
}
myString.prototype = String.prototype;
var x = new myString("foo");
x.a();
Я также пробовал:
myString.prototype = new String();
Теперь, пытаясь исследовать это, я обнаружил, что это работает:
var myString = function (n){
var s = new String(n);
s.a = function (){
alert(this);
};
return s;
}
var x = myString("foo");
x.a();
Однако, это почти похоже на "обманывание" для меня. Например, я должен использовать "реальную" модель наследования, а не этот ярлык.
Итак, мои вопросы:
1) Можете ли вы сказать мне, что я делаю неправильно в отношении наследования от String? (Желательно с рабочим примером...)
2) Между примером "реального" наследования и примером "ярлыка" можно назвать любые явные преимущества или недостатки одним способом над другим? Или, может быть, только некоторые различия в том, как можно функционировать над другим? (Потому что они в конечном итоге выглядят одинаково для меня...)
Спасибо всем!
EDIT:
Спасибо всем, кто прокомментировал/ответил. Я думаю, что информация @CMS лучше всего, потому что:
1) Он ответил на мою проблему наследования строк, указав, что частично переопределив String в моем собственном строковом объекте, я мог бы заставить его работать. (например, переопределение toString и toValue) 2) Создание нового объекта, который наследуется от Array, имеет свои собственные ограничения, которые не были сразу видны и не могут быть обработаны даже частично путем переопределения массива.
Из приведенных выше двух вещей я пришел к выводу, что требование JavaScript о наследовании распространяется только на объекты, которые вы создаете сами, и что когда дело доходит до нативных объектов, вся модель ломается. (Вероятно, поэтому 90% примеров, которые вы найдете, это Pet- > Dog или Human- > Student, а не String- > SuperString). Который может быть объяснен @chjj ответом на то, что эти объекты действительно предназначены для примитивных значений, даже если все в JS кажется объектом и поэтому должно быть на 100% наследуемым.
Если этот вывод полностью отключен, пожалуйста, исправьте меня. И если это точно, то я уверен, что это не новость никому, кроме меня самого, - но еще раз спасибо за комментирование. Полагаю, теперь у меня есть выбор:
Идите вперед с паразитическим наследованием (мой второй пример, который я теперь знаю для имени), и попытайтесь уменьшить влияние использования памяти, если это возможно, или сделайте что-то вроде @davin, @Jeff или @chjj, предлагаемого и либо psudo- переопределить или полностью переопределить эти объекты для себя (что кажется пустой тратой).
@CMS - скомпилируйте свою информацию в ответ, и я выберу ее.