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

Я много искал, как делать свойства в Javascript. Большинство шаблонов раскрывающих модулей, которые я видел, имеют исключительно открытые функции, и по опыту я знаю, что если я открываю объект, я действительно получаю копию значения прямо здесь и тогда, таким образом, просто я мог бы иметь функцию getMyThing() и setMyThing и выставьте это. Однако я хочу выставить настоящие свойства

Я видел олдскульный defineGetter, которого я избегаю, и более новый Object.defineProperty( с которым у меня были настоящие проблемы. (Я мог легко использовать его против искусственного объекта, но не ЭТО внутри моего " module», ни свойство внутри моего модуля, которое я хотел раскрыть.

var myobj = (function() {  
    var name = "default name"
    var sayName = function() { return "hello " + name }
  return {
   badname : name, //this won't change
   sayName : sayName,
   get name() { return name;},
   set name(value) { name = value ;}

  }
})()
alert("should be default because its just a copy: " + myobj.badname)
alert("should be default: " + myobj.name)
myobj.name = "karl"
alert("should be default because its just a copy: " + myobj.badname)
alert("should be karl: "  + myobj.name)

Во всяком случае, я вижу в нескольких местах, что вы можете использовать ключевые слова get и set, и у меня есть следующий пример, который работает для меня, по крайней мере, в Firefox и ie10.

Мой вопрос: это приемлемый подход или есть скрытые ошибки, о которых я не знаю. Является ли этот подход наиболее приемлемым в современных браузерах? Как называется эта функция? и какое официальное название функции Object.defineProperty? Я предполагаю, что использование ключевого слова get и set - это геттеры и сеттеры ECMAScript5, но как называется другой?

и ключевые слова get и set упоминаются в этой таблице совместимости http://kangax.github.io/es5-compat-table/ в категории «Getter в инициализаторе свойства» и «Setter в инициализаторе свойства»?

пример на JSfiddle — http://jsfiddle.net/klumsy/NagbE/1/


person klumsy    schedule 26.04.2013    source источник
comment
Этот вопрос в его нынешнем виде немного неясен - вы можете затянуть его (вопросы о том, хорошо ли это? Обычно закрываются)   -  person slifty    schedule 26.04.2013
comment
Возможный дубликат Есть ли в Javascript ключевые слова get/set, такие как C#?   -  person Jan Turoň    schedule 09.11.2015


Ответы (1)


Шаблон, который вы используете, выглядит хорошо. Он будет поддерживаться всеми браузерами ES5.

Синтаксис get и set внутри литерала объекта часто называют расширениями литерала объекта ES5 для определения свойств доступа. Свойство доступа — это свойство, состоящее из геттера и/или сеттера. Термин для традиционного вида свойства, которое не является методом получения/установки, называется свойство данных.

И, да, это то, на что ссылается таблица совместимости kangax под «... в инициализаторе свойства» (если вы наведете курсор мыши на серую букву «c» с кружком вокруг нее на этой странице, вы увидите фактический тест, который выполняется бежать).

Функции мета-свойств, предоставляемые Object.defineProperty, называются дескрипторами свойств. В ES5 есть два типа дескрипторов свойств: дескрипторы данных и дескрипторы доступа, которые состоят из следующих свойств дескриптора:


Дескриптор данных: value, writable, enumerable, configurable

Пример:

Object.defineProperty(obj, 'prop', {
    value: 'some value',
    writable: true,
    enumerable: false,
    configurable: true
});

Дескриптор доступа: get, set, enumerable, configurable

Пример:

Object.defineProperty(obj, 'prop', {
    get: function() { return 'foo'; },
    set: function() { /* do something... */ },
    enumerable: false,
    configurable: true
});
person Nathan Wall    schedule 28.04.2013
comment
Хороший информативный ответ, но, хотя это не его вопрос, он как бы обходит, почему у ОП возникают проблемы с использованием this для defineProperty. - person ProfK; 10.12.2014