Ответ Jan Turoň выше очень близок и может быть лучшим для использования в браузере из-за проблем совместимости, но потенциально может вызвать некоторые странные проблемы с перечислением. Например, выполнить:
for ( var i in someArray ) { ... }
Назначит метод clone () для i после итерации элементов массива. Вот адаптация, которая избегает перечисления и работает с node.js:
Object.defineProperty( Object.prototype, "clone", {
value: function() {
if ( this.cloneNode )
{
return this.cloneNode( true );
}
var copy = this instanceof Array ? [] : {};
for( var attr in this )
{
if ( typeof this[ attr ] == "function" || this[ attr ] == null || !this[ attr ].clone )
{
copy[ attr ] = this[ attr ];
}
else if ( this[ attr ] == this )
{
copy[ attr ] = copy;
}
else
{
copy[ attr ] = this[ attr ].clone();
}
}
return copy;
}
});
Object.defineProperty( Date.prototype, "clone", {
value: function() {
var copy = new Date();
copy.setTime( this.getTime() );
return copy;
}
});
Object.defineProperty( Number.prototype, "clone", { value: function() { return this; } } );
Object.defineProperty( Boolean.prototype, "clone", { value: function() { return this; } } );
Object.defineProperty( String.prototype, "clone", { value: function() { return this; } } );
Это позволяет избежать перечисления метода clone (), поскольку defineProperty () по умолчанию перечисляет значение false.