02.12.2014, 14:16
|
Новичок на форуме
|
|
Регистрация: 02.12.2014
Сообщений: 2
|
|
Простая задачка на идентичность объектов
Пожалуйста, подскажите, как решить вот такую задачку:
// Заставьте это работать
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
|
|
02.12.2014, 14:32
|
|
junior
|
|
Регистрация: 29.11.2011
Сообщений: 3,924
|
|
глубоко не вчитываясь:
1. Dummy - синглтон
2. либо переопределить valueOf
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
|
|
02.12.2014, 14:51
|
Новичок на форуме
|
|
Регистрация: 02.12.2014
Сообщений: 2
|
|
Точно, синглтон, гениально! Спасибо!
Последний раз редактировалось Kosanna, 02.12.2014 в 14:56.
|
|
02.12.2014, 15:01
|
Профессор
|
|
Регистрация: 09.11.2014
Сообщений: 610
|
|
Сообщение от Kosanna
|
console.info('foo === bar ->', foo === bar); // true
|
и при этом
var foo = new Dummy();
var bar = new Dummy();
Это невозможно в принципе. 2 разных объекта не могут быть одним и тем же. Насчет второго я не допер. Вы хотите, чтобы все экземпляры наследовали от класса, и меняли свойство класса, а не свое собственное?
Последний раз редактировалось krutoy, 02.12.2014 в 15:16.
|
|
02.12.2014, 22:48
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
// Заставьте это работать
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
|
|
02.12.2014, 23:12
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,108
|
|
Сообщение от Kosanna
|
// что-то тут нужно написать
|
// Заставьте это работать
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
|
|
02.12.2014, 23:56
|
|
Профессор
|
|
Регистрация: 13.03.2013
Сообщений: 1,572
|
|
Еще вариант
/// Заставьте это работать
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;
Последний раз редактировалось Vlasenko Fedor, 03.12.2014 в 00:10.
|
|
03.12.2014, 03:53
|
Профессор
|
|
Регистрация: 15.03.2014
Сообщений: 561
|
|
// Заставьте это работать
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
|
|
|
|