Редактировать: Спасибо @Aadit M Shah за подтверждение.Что такое эквивалент Javascript переменной класса?
function Apple() {}
Apple.someVar = null; // Class variable
Apple.prototype.someVar = null; // Instance variable
Редактировать: Спасибо @Aadit M Shah за подтверждение.Что такое эквивалент Javascript переменной класса?
function Apple() {}
Apple.someVar = null; // Class variable
Apple.prototype.someVar = null; // Instance variable
JavaScript является функциональным языком, и особенности классических языков программирования не поддерживаются напрямую, но могут быть достигнуты за счет концепции закрытия.
В приведенном фрагменте кода как Apple.someVar, так и Apple.prototype.someVar будут иметь одинаковое значение для всех объектов, созданных из функции конструктора Apple, то есть как переменная класса.
Для обеспечения функциональности переменных экземпляра используйте блокировки. Вы можете посмотреть онлайн дополнительную помощь по закрытию, здесь ссылка http://javascript.crockford.com/private.html
Я предоставляю небольшой фрагмент кода, чтобы сделать его понятным.
function Apple(property){
var color = property.color; //instance variable
this.getColor = function(){
return color;
};
}
Apple.type = "fruit"; //class variable
var redApple = new Apple({color:'red'});
var greenApple = new Apple({color:'green'});
как переменное RedApple и greenApple один и тот же свойство «тип», но каждый из них имеет свою собственный цвет собственность.
Фрагмент кода вообще не использует замыкания. –
Ваш пример «закрытия» на самом деле не использует закрытие. Вам не нужна локальная переменная 'color'. (Если вы определили метод 'this.someMethod = function() {}' внутри 'Apple()', который использовал 'color' * then *, вы бы использовали закрытие.) – nnnnnn
Я просто хотел дать упрощенную версию используя замыкания для достижения концепции переменной экземпляра. Лучше всего было бы использовать геттеры для получения значения свойства цвета –
В статических членах класса (то есть Java) статические элементы создаются со специальным синтаксисом и могут использоваться так, как если бы они были членами самого класса.
В JavaScript нет специального синтаксиса для обозначения статических свойств. Однако вы можете реализовать такое классное поведение, используя функцию конструктора и добавляя к нему свойства. Конструкторы, как и все другие функции, являются объектами и могут иметь свойства.
Давайте посмотрим пример:
У нас есть конструктор для автомобилей, статический метод для автомобилей и «экземпляр» (прототип делегирования) метод для автомобилей.
// constructor
var Car = function() {};
// a static method
Car.isShiny = function() {
return "bling bling";
};
// "instance" method added to the prototype
Car.prototype.setPrice = function (price) {
this.price = price;
};
Как и ожидалось, мы можем вызвать статический метод и метод «экземпляр».
// calling a static method
Car.isShiny(); // "bling bling"
// creating an instance and calling a method
var ford = new Car();
ford.setPrice(5000);
Вызов метода «экземпляр» статически не будет работать. Аналогично, вызов статического метода в экземпляре не будет работать.
typeof Car.setPrice; // "undefined"
typeof ford.isShiny; // "undefined"
Существует обходное решение для вызова статического метода в экземпляре. Определите метод прототипа, который ссылается на статический метод.
Car.prototype.isShiny = Car.isShiny;
ford.isShiny(); // "bling bling"
Однако это связано с небольшим осложнением, о котором мы должны знать. Ключевое слово this
, если оно используется в статическом методе, будет ссылаться либо на конструктор Car
, либо на экземпляр ford
, в зависимости от того, кто является вызывающим.
Возможно иметь тот же метод, который называется статически и нестатически. С помощью instanceof
мы можем знать, как был вызван метод.
// constructor
var Car = function (price) {
this.price = price;
};
// a static method
Car.isShiny = function() {
// this always works
var msg = "bling bling";
if (this instanceof Gadget) {
// this only works if called non-statically
msg += ", it costs $" + this.price + '!';
}
return msg;
};
// a normal method added to the prototype
Car.prototype.isShiny = function() {
return Car.isShiny.call(this);
};
// static call
Car.isShiny(); // "bling bling"
//non static call
var benz = new Car('9999.99');
benz.isShiny(); // "bling bling, it costs $9999.99!"
Этот пример иллюстрирует использование открытых статических элементов. В JavaScript вы также можете использовать частные статические члены.
Справка: JavaScript Patterns book.
function Apple() {}
Apple.someVar = null; // property on the constructor - doesn't affect instances
Apple.prototype.someVar = null; // the default value of the `someVar` property on instances returned by the constructor when using the `new` keyword
Вот более подробный пример, чтобы увидеть его в действии:
function Apple() {}
Apple.color = 'blue'; // this doesn't do what you think it does.
console.log('Apple.color:', Apple.color); // blue
console.log('---');
// basic instantiation of the apples
var goldenDelicious = new Apple();
var grannySmith = new Apple();
var fuji = new Apple();
console.log('goldenDelicious.color:', goldenDelicious.color); // undefined
console.log('grannySmith.color:', grannySmith.color); // undefined
console.log('fuji.color:', fuji.color); // undefined
console.log('---');
fuji.color = 'red';
Apple.prototype.color = 'green';
// overrides color properties of all apples that have not
// had their color set - even those of instances already created
// This is because their value is the default, and we are
// modifying that default.
console.log('goldenDelicious.color:', goldenDelicious.color); // green
console.log('grannySmith.color:', grannySmith.color); // green
console.log('fuji.color:', fuji.color); // red
console.log('---');
// assign some actual colors
goldenDelicious.color = 'yellow';
grannySmith.color = 'green';
fuji.color = 'red';
console.log('goldenDelicious.color:', goldenDelicious.color); // yellow
console.log('grannySmith.color:', grannySmith.color); // green
console.log('fuji.color:', fuji.color); // red
console.log('---');
Apple.prototype.color = 'orange'; // all new apples will default to orange
var honeyCrisp = new Apple();
console.log('goldenDelicious.color:', goldenDelicious.color); // yellow
console.log('grannySmith.color:', grannySmith.color); // green
console.log('fuji.color:', fuji.color); // red
console.log('honeyCrisp.color:', honeyCrisp.color); // orange
Да, 'Apple.someVar' фактически является "переменная класса". –
Я не знаю, на каком языке фраза «переменная класса», но «Apple.prototype.someVar» - это свойство и значение, которое будет передано экземплярам «Apple», а не «Apple.someVar». – Sidd