0

Редактировать: Спасибо @Aadit M Shah за подтверждение.Что такое эквивалент Javascript переменной класса?

function Apple() {} 
Apple.someVar = null; // Class variable 
Apple.prototype.someVar = null; // Instance variable 
+2

Да, 'Apple.someVar' фактически является "переменная класса". –

+0

Я не знаю, на каком языке фраза «переменная класса», но «Apple.prototype.someVar» - это свойство и значение, которое будет передано экземплярам «Apple», а не «Apple.someVar». – Sidd

ответ

2

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 один и тот же свойство «тип», но каждый из них имеет свою собственный цвет собственность.

+0

Фрагмент кода вообще не использует замыкания. –

+0

Ваш пример «закрытия» на самом деле не использует закрытие. Вам не нужна локальная переменная 'color'. (Если вы определили метод 'this.someMethod = function() {}' внутри 'Apple()', который использовал 'color' * then *, вы бы использовали закрытие.) – nnnnnn

+0

Я просто хотел дать упрощенную версию используя замыкания для достижения концепции переменной экземпляра. Лучше всего было бы использовать геттеры для получения значения свойства цвета –

2

В статических членах класса (то есть 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.

0

Т.Л., д-р

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