Простая задачка на идентичность объектов
Пожалуйста, подскажите, как решить вот такую задачку:
// Заставьте это работать function Dummy() { // что-то тут нужно написать } Dummy.prototype.value = 'dummy'; Dummy.prototype.setValue = function (value) { this.value = value; }; Dummy.prototype.getValue = function () { return this.value; }; // Используем var foo = new Dummy(); var bar = new Dummy(); bar.setValue(123); // Тесты console.log('-------------------'); console.info('foo === bar ->', foo === bar); // true console.log('values:', [foo.getValue(), bar.getValue()]); // [123, 123] // Bonus level //baz = Dummy(); //console.info('baz === bar ->', baz === bar, baz.getValue()); // true, 123 |
глубоко не вчитываясь:
1. Dummy - синглтон 2. либо переопределить valueOf |
Точно, синглтон, гениально! Спасибо!
|
Цитата:
var foo = new Dummy(); var bar = new Dummy(); Это невозможно в принципе. 2 разных объекта не могут быть одним и тем же. Насчет второго я не допер. Вы хотите, чтобы все экземпляры наследовали от класса, и меняли свойство класса, а не свое собственное? |
// Заставьте это работать var Dummy = new function Dummy() { var instance; this.value = 'dummy'; function Dummy() { if (!instance) instance = this; else return instance; Dummy.prototype.setValue = function (value) { this.value = value; }; Dummy.prototype.getValue = function () { return this.value; }; } return Dummy; } // Используем var foo = new Dummy(); var bar = new Dummy(); bar.setValue(123); // Тесты console.log('-------------------'); console.info('foo === bar ->', foo === bar); // true console.log('values:', [foo.getValue(), bar.getValue()]); // [123, 123] // Bonus level baz = Dummy(); console.info('baz === bar ->', baz === bar, baz.getValue()); // true, 123 |
Цитата:
// Заставьте это работать function Dummy() { // что-то тут нужно написать if (!arguments.callee.instance) { arguments.callee.instance = { setValue: this.setValue, getValue: this.getValue }; } return arguments.callee.instance; } Dummy.prototype.value = 'dummy'; Dummy.prototype.setValue = function (value) { this.value = value; }; Dummy.prototype.getValue = function () { return this.value; }; // Используем var foo = new Dummy(); var bar = new Dummy(); bar.setValue(123); // Тесты alert('foo === bar ->'+ (foo === bar)); // true alert('values:'+ [foo.getValue(), bar.getValue()]); // [123, 123] // Bonus level baz = Dummy(); alert('baz === bar ->'+ [baz === bar, baz.getValue()]); // true, 123 |
Еще вариант
/// Заставьте это работать function Dummy() { // что-то тут нужно написать if (Dummy.prototype.instance) { return Dummy.prototype.instance; } Dummy.prototype.instance = this; } Dummy.prototype.value = 'dummy'; Dummy.prototype.setValue = function (value) { this.value = value; }; Dummy.prototype.getValue = function () { return this.value; }; // Используем var foo = new Dummy(); var bar = new Dummy(); bar.setValue(123); // Тесты alert('foo === bar ->'+ (foo === bar)); // true alert('values:'+ [foo.getValue(), bar.getValue()]); // [123, 123] // Bonus level baz = Dummy(); alert('baz === bar ->'+ [baz === bar, baz.getValue()]); // true, 123 и так if (arguments.callee._singletonInstance) return arguments.callee._singletonInstance; arguments.callee._singletonInstance = this; |
// Заставьте это работать function Dummy() { if (!Dummy.cache) Dummy.cache = Object.create( Dummy.prototype ); return Dummy.cache; } Dummy.prototype.value = 'dummy'; Dummy.prototype.setValue = function (value) { this.value = value; }; Dummy.prototype.getValue = function () { return this.value; }; // Используем var foo = new Dummy(); var bar = new Dummy(); bar.setValue(123); // Тесты //console.log('-------------------'); console.info('foo === bar ->', foo === bar); // true console.log('values:', [foo.getValue(), bar.getValue()]); // [123, 123] // Bonus level baz = Dummy(); console.info('baz === bar ->', baz === bar, baz.getValue()); // true, 123 |
Часовой пояс GMT +3, время: 13:03. |