Пусть у нас есть код:
var obj = new Func(); // Func -- произвольная функция
Мы хотели бы создать объект, используя тот же конструктор, что и obj.
Будет ли этот код работать? Если не для всех Func, то для каких?
var obj2 = new obj.constructor;
Решение
Решение
Обычно — будет работать. Например:
function Func() {
this.toString = function() { return 'Func!'; };
}
var obj = new Func();
var obj2 = new obj.constructor();
alert(obj2); // Func!
.. Но это работает только птому, что Func.prototype.constructor == Func. Если кто-то перезапишет Func.prototype (или заменит constructor), то код не сработает:
function Func() {
this.toString = function() { return 'Func!'; };
}
*!*
Func.prototype = {};
*/!*
var obj = new Func();
var obj2 = new obj.constructor();
alert(obj2); // [object Object]
В результате изменения конструктора в obj2 создался пустой объект new Object.
#309