Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Классы в javascript? (https://javascript.ru/forum/misc/25651-klassy-v-javascript.html)

poorking 16.02.2012 14:26

Mахmахmахimus,
Class.staticProperty

var Class = function (value) {
    this.value = value;
};

Class.staticProperty = 42;

Class.prototype = {
    getAnswer: function () {
        return Class.staticProperty + this.value;
    }
};


var c = new Class(100500);

alert(c.getAnswer());



Но в настоящих классах можно и так и через this. То есть если ты напишешь this.staticProperty = 777, то и Class.staticProperty должно стать 777, без сеттеров не обойтись, причем это должно отразиться на всех инстансах (везде this.staticProperty должно стать 777), то есть надо будет еще хранить ссылки на все инстансы

МаксМаксМаксимус, лучше б ты время не тратил, это все незачем.. Зачем программировать на JS как на C ++? Это другой язык со своими особенностями. И даже если и получится у тебя разграничить права доступа к полям, надо еще чтоб наследование работало


Обычно хватает чего то типа:
Function.prototype.extend = function (prototype) {
	if (typeof prototype !== "object") {
		prototype = {};
	}
	var self = this, constructor = (prototype.hasOwnProperty("constructor") &&
		typeof prototype.constructor === "function") ? prototype.constructor :
		function () { self.apply(this, arguments); }, F = function () {}, property;	
	F.prototype = self.prototype;
	constructor.prototype = new F();
	for (property in prototype) if ( prototype.hasOwnProperty(property) ) {
		constructor.prototype[property] = prototype[property];
	}
	constructor.prototype.constructor = constructor;
	constructor.superclass = self.prototype;
	return constructor;
}

Mахmахmахimus 16.02.2012 14:51

Цитата:

Сообщение от poorking
без сеттеров не обойтись

я пока делаю считывание через this.name
а установку через this.static('name', 43)


потом сеттерами или проксями сделаю

Цитата:

Сообщение от poorking
Обычно хватает чего то типа:

Мне кажется это костыль, и еще я ни фига не понял тут, я делаю либу для удобства же. Чтобы люди которые привыкли к классам моли нормально работать.

Цитата:

Сообщение от poorking
Зачем программировать на JS как на C ++?

Потомоу что надоели ныть все. А еще это отточит мой скилл. И в третьих мне это интересно.
Цитата:

Сообщение от poorking
И даже если и получится у тебя разграничить права доступа к полям, надо еще чтоб наследование работало

Да, разумеется.

Слушай, а сеттеры и геттеры как динамически устанавливать, а не литерально, и второе, кто их поддерживает?

Вот такое обьявление класса удобно? И как бы хотелось тебе если бы ты сделал?


var Cat = Class(function() {
	this.public({
		w : function() {
			alert(this.all)
		}
	})
	this.public.static({
		all : "общее публичное свойство"
	})
	this.private({
		'bar' : 300
	})
	this.private.static({
		'baz' : "общее приватное свойство"
	})
})

poorking 16.02.2012 14:58

Mахmахmахimus,
Ну буду тебе врать, я с ними только для ознакомления работал, на практике не применяю.
Defining getters and setters
Но это не кроссбраузерно, хотя вроде как не сильно старые браузеры поддерждивают

Mахmахmахimus 16.02.2012 15:57

poorking,
Спасибо огромное, добавил сайт в закладки.
И последний вопрос, даже стыдно как-то, какие версии ECMA соответствуют каким версиям Javascript и какие версии javascript сейчас в последних версиях браузеров? Я даже не знаю как это гуглить.

poorking 16.02.2012 16:02

Mахmахmахimus,
Определение версии JavaScript, поддерживаемой браузером
А прям готовую таблицу не знаю где взять

Mахmахmахimus 16.02.2012 16:04

poorking,
Спасибо, я тебя в авторство либы припишу;)

1.8 - Firefox
1.7 - Chrome 19 canary
1.5 - Opera
1.3 - IE9

и это на 1012 год!

poorking 16.02.2012 16:06

Mахmахmахimus,

Mахmахmахimus 16.02.2012 16:29

Короче я не буду поддерживать IE и плевать мне на все, это IE должен поддерживать javascript а не javascript должен поддерживать IE.

Я бы конечно мог сделать 2 версии одну с поддержкой IE и вот таким синтаксисом тупым, ноя не хочу, в любом случае в новой версии IE будет поддерживаться новый JS так что буду делать на будущее. А во вторых я под IE не верстаю че-то серьезное, даже на деньги.

Mахmахmахimus 16.02.2012 19:08

poorking,
static public будут видны дочерним классам,
static private не будут видны дочерним классам, так?

poorking 16.02.2012 19:17

Mахmахmахimus,
static поля не зависмы от контекста. Чтобы получить получить значение static поля или вызвать static метод, даже инстанцировать класс не нужно. public значит доступны везде и снаружи и внутри и всем потомкам. static private - значит доступны только внутри механизма класса, но также не зависимы от контекста. Гугл закрыли? ну хотя бы тут посмотри http://php.su/learnphp/phpoo/?php5

Ах, да, не забудь про перегрузку полей, и что потомки не могут сужать права доступа к полям, а только расширять.
Тебе будет грустно когда ты поймешь, что полноценные классы реализовать не получится.


Часовой пояс GMT +3, время: 21:37.