Поскольку 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: The Good Parts by Douglas Crockford:
//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, чтобы получить реализацию для старых браузеров. (См. John Resig's article on new ES5 features including Object.create).
В ES5 вы можете сделать это следующим образом:
//using Object.create - doesn't use "new"
var baseObj = { prop1: "hello base" };
var testObj3 = Object.create(baseObj);
console.log(testObj3.prop1);
Я надеюсь, что помогает
Почему этот wiki сообщества? – James
Почему вы не можете использовать ключевое слово 'new'? –
Даниил, на самом деле вы можете, и я неправильно предположил, что в этом случае я не мог. В пятницу днем усталость, я думаю;). – avernet