Pull to refresh

Comments 21

Только по постскриптуму догадался что это и на каком языке написано.
Проверяйте во всех браузерах, тогда поговорим =)
Конгениально!!! Нобелевскую премию товарищу!!!

Это же сверхидея, заменить конструктор объекта самим объектом в процессе.

Делаем так:

Извиняюсь:

x = new a(); // a.constructor = a()
var b = new a(); // Error: a is not a constructor

И все, нет никакого синглтона
Совершенно не понял смысла написанного.
Смысл в том, что вы не реализовали синглтон, а просто заменили конструктор экземпляром. То есть второй раз вызывать вы должны уже экземпляр, а откуда вы знаете, экземпляр у вас уже в данном месте программы или только конструктор??? Значит надо будет каждый раз проверять свойство a.constructor на существование. А смысл паттерна синглтон как раз в единообразии вызова в любом месте программы.
Смысл в том, что единожды создав объект, и удалив его конструктор, нельзя создать еще один экземпляр.

А если менять код, то это будет другой код, а не криво просто работающий.
Знаю я, что там экземпляр, потому что я его туда положил. А далее работаю с обычным объектом, имея гарантию, что других экземпляров быть не может.
По-нормальному синглтон в яваскрипте реализуется так:

var a = {
_property:null,
property:function(value){
if (value) {
this._property = value;
return this._property;
} else {
return this._property;
}
}
};

a.property('sdds');
var b = new a(); // Error: a is not a constructor
Так нельзя получить приватные св-ва и методы.
А только «приватные на словах».
После того, как наткнулся на WTF при попытке расширить приложение из-за Singleton'а, считаю его глобальной переменной и всячески его избегаю.
Я пока мало программировал, так что пока не натыкался :)
Тоже вариант.
Но constructor будет function. Т.е. по сути неопределенный тип. И если при передаче в функцию надо проверить то ли передали, не подойдет.
А такой вариант

function C(p)
{
if(!(this instanceof C))
return new C(p);

if(!C.Singleton)
{
C.Singleton = this;

/* TODO */
this.p = p;
}
else return C.Singleton;
};

var x = new C(1);
var y = C(2);
var z = new C(3);

alert("x == z : " + (x == z));
alert("x === z : " + (x === z));
alert("x:"+x.p+", y:"+y.p+", z:"+z.p);


Ну или покороче

function C(p)
{
if(!(this instanceof C)) return new C(p);
else if(C.Singleton) return C.Singleton;
C.Singleton = this;

/* TODO */
this.p = p;

};

var x = new C(1);
var y = C(2);
var z = new C(3);

alert("x == z : " + (x == z));
alert("x === z : " + (x === z));
alert("x:"+x.p+", y:"+y.p+", z:"+z.p);
Вроде работает, вроде все хорошо, но что-то все-таки не так. Наверное, код слишком избыточен, т.е. сложнее для понимание. ИМХО
А хотя… если разобраться повнимательней…
работает instanceof, в отличие от моего варианта
А если так

function a (){
this.name ='test';
}
b = a;
a = new a();
c= new a.constructor()
console.log(c.name);
console.log(c instanceof b);
Жесткая получается штука, впрочем как и всегда в JS — цена свободы…
Sign up to leave a comment.

Articles