Показать сообщение отдельно
  #1 (permalink)  
Старый 01.11.2010, 19:08
Аватар для vflash
Профессор
Отправить личное сообщение для vflash Посмотреть профиль Найти все сообщения от vflash
 
Регистрация: 09.07.2007
Сообщений: 304

Создание конструктора ("класса")
Стандартный способ, самый простой и понятный.
var clssX = function() {
	alert(this.text); // show "Text"
	};

clssX.prototype.text = 'Text';
var objX = new clssX();


мой конструктор класса.

var rr = {
	new_class: function() {
		var oc = Object.prototype.constructor;
		function cn(){}; // null constructor

		function clss(c) {
			return function(a1,a2,a3) {
				var x = c.parent, l, m, u;

				if (typeof x === 'function') {
					x.apply(this, arguments);
					};

				if (c.factory) {
					switch(l = arguments.length){ // for fast
						case 0: x = c.factory(this); break;
						case 1: x = c.factory(this, a1); break;
						case 2: x = c.factory(this, a1, a2); break;
						case 3: x = c.factory(this, a1, a2, a3); break;

						default:
							for(m = [this]; x = l--;) m[x] = arguments[l];
							x = c.factory.apply(c, m);
						};

					if (x !== u) return x;
					};
				}
			};


		return function(c) {
			if (c) {
				var p = c.parent, i, s, u;

				if (p = p && p.prototype) {
					cn.prototype = p;
					p = new cn;

					if (s = c.prototype) {
						for(i in s) if (s[i] !== u) p[i] = s[i];
						c.prototype = p;
						};
					};

				s = c.constructor;
				if (!s || s === oc) s = clss(c);

				if (p = c.prototype) s.prototype = p;

				if (i = c.interface) s.prototype[i === true ? 'interface' : i] = c;
				s.interface = c;

				return s;
				}
			}
		}(),


	newTemplate: function() {
		var c = function(){}, cp = c.prototype, ie=!(function(i) {for(i in {constructor:1}) return 1})(), s = !{}.__proto__;

		return function(p) {
			c.prototype = p || cp;
			var x = new c, l = arguments.length, i = 1, n, e;
			if (!s) {x.__proto__ = p; c.prototype = x; x = new c};

			while(i < l) {
				if (e = arguments[i++]) {
					for (n in e)
						if (e.hasOwnProperty(n))
							c[n] = e[n];

					if (ie && e.hasOwnProperty(n = 'constructor'))
						c[n] = e[n];
					};
				};

			return x;
			}
		}()
	};


пример как использую:

var clssA = rr.new_class({
	constructor: function() {
		alert(this.text); // show "Text"
		},

	prototype: {
		text: 'Text'
		}
	});


var clssB = rr.new_class({
	parent: clssA,
	constructor: function() {

		alert(this.text+': '+this.value); //show "Text: bla bla bla"
		},

	prototype: {
		value: 'bla bla bla'
		}
	});


var clssC = rr.new_class({
	factory: function(obj) {
		alert(obj.A + this.B); // show (20)
		},

	prototype: {
		A: 12
		},

	B: 8
	});


var clssD = rr.new_class({
	parent: clssA,
	factory: function(obj) {
		alert(obj.text +": "+obj.X); // show "Text: eeeeee ee ee"
		},

	 prototype: {
		X: "eeeeee ee ee"
		}
	});


var itE, clssE = rr.new_class(itE = {
	interface: true,
	constructor: function() {
		alert(this.interface.value); // show "test"
		},

	value: 'test'
	});

var clssF = rr.new_class(itE = {
	interface: 'obj_config',
	constructor: function() {
		alert(this.obj_config.value); // show "test"
		},

	value: 'test'
	});



var objA = new clssA(); // show "Text"
var objB = new clssB(); //show "Text: bla bla bla"
var objD = new clssC(); //show "Text" and show "Text: eeeeee ee ee"


alert(clssE.interface == itE); // show true


иногда нужно сразу создать обьект у которого определенный протатип:

var objN = rr.newTemplate(prot, {
	AAA: 1,
	BB: 2
	});
__________________
лучшая rss читалка zzreader.com

Последний раз редактировалось vflash, 01.11.2010 в 22:20.
Ответить с цитированием