2010-03-02 4 views
5

Есть ли способ скопировать глобальный объект (Array, String ...), а затем расширить прототип копии, не затрагивая исходную? Я пытался с этим:Скопируйте и расширьте глобальные объекты в javascript

var copy=Array; 
copy.prototype.test=2; 

Но если я проверить Array.prototype.test это 2, так как объект Массив передается по ссылке. Я хочу знать, есть ли способ заставить переменную «copy» вести себя как массив, но может быть расширен без влияния на исходный объект Array.

+0

Я предполагаю, что первая строка на самом деле читает: 'var copy = Array;' –

+0

Да, извините, я ее обновил – mck89

+0

Для создания массива типа «класс» см. Http://stackoverflow.com/questions/366031/implement -array-like-behavior-in-javascript-without-use-array Похоже, вы не понимаете наследование Javascript. Вы должны Google что-то вроде «прототипного наследования Javascript». –

ответ

2

Хороший вопрос. У меня такое чувство, что для этого вам, возможно, придется написать класс-оболочку. То, что вы в основном делаете с copy.prototype.test=2, задает прототип класса, который (конечно) будет видимым для всех экземпляров этого класса.

+0

Есть ли у вас пример для класса-оболочки? – mck89

+0

@ mck89: извините, я не заметил вашего комментария здесь. Функция уведомления S.O. требует некоторой работы, LOL. Полагаю, вам удалось отсортировать класс-упаковщик? – Codesleuth

+0

Да, я нашел что-то на http://dean.edwards.name/weblog/2006/11/hooray/ – mck89

0

Вместо продления прототипа, почему бы вам просто не расширить копию. Например, добавление функции

copy.newFunction = function(pParam1) { 
     alert(pParam1); 
}; 
+0

Потому что таким образом, если я создам новый экземпляр копии, у него не будет метода, потому что это займет только прототипы. В любом случае это не решает проблему, потому что она также расширяет исходный объект Array. – mck89

1

Я думаю, что причина, по которой пример http://dean.edwards.name/weblog/2006/11/hooray/ не работает, потому что это анонимная функция. Таким образом, вместо того, чтобы следующее:

// create the constructor 
var Array2 = function() { 
    // initialise the array 
}; 

// inherit from Array 
Array2.prototype = new Array; 

// add some sugar 
Array2.prototype.each = function(iterator) { 
// iterate 
}; 

вы хотите что-то вроде этого:

function Array2() { 

} 
Array2.prototype = new Array(); 

Из моего собственного тестирования, length свойства поддерживается в IE с этим наследованием. Кроме того, все, что добавлено к MyArray.prototype, похоже, не добавляется к Array.prototype. Надеюсь это поможет.

Смежные вопросы