Поскольку в JavaScript нет классов, позвольте мне перефразировать ваш вопрос: как создать новый объект на основе существующего без использования ключевого слова new?
Вот метод, который не использует «новый». Это не совсем «новый экземпляр», но это единственный способ, о котором я мог думать, без использования «нового» (и без использования каких-либо функций ECMAScript 5).
//a very basic version that doesn't use 'new'
function factory(clazz) {
var o = {};
for (var prop in clazz) {
o[prop] = clazz[prop];
}
return o;
};
//test
var clazz = { prop1: "hello clazz" };
var testObj1 = factory(clazz);
console.log(testObj1.prop1); //"hello clazz"
Вы можете пофантазировать и установить прототип, но тогда вы столкнетесь с проблемами кроссбраузерности, и я стараюсь не усложнять. Также вы можете использовать hasOwnProperty для фильтрации того, какие свойства вы добавляете к новому объекту.
Есть и другие способы использовать слово «новое», но как бы его скрыть. Вот тот, который заимствован из функции Object.create в JavaScript: Хорошие моменты Дугласа Крокфорда:
//Another version the does use 'new' but in a limited sense
function factory(clazz) {
var F = function() {};
F.prototype = clazz;
return new F();
};
//Test
var orig = { prop1: "hello orig" };
var testObj2 = factory(orig);
console.log(testObj2.prop1); //"hello orig"
В EcmaScript 5 есть метод Object.create, который делает это намного лучше, но поддерживается только в новых браузерах (например, IE9, FF4), но вы можете использовать polyfill (то, что заполняет трещины), например ES5 Shim, чтобы получить реализацию для старых браузеров. (См. статью Джона Ресига о новых функциях ES5, включая Object.create ).
В ES5 это можно сделать так:
//using Object.create - doesn't use "new"
var baseObj = { prop1: "hello base" };
var testObj3 = Object.create(baseObj);
console.log(testObj3.prop1);
Надеюсь, это поможет
person
Community
schedule
22.04.2011
new? - person Daniel Pryden   schedule 17.10.2009