3

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

Я видел OLDSCHOOL defineGetter который я избегаю и новой Object.defineProperty (который я имел некоторые реальные проблемы с. (Я мог бы легко использовать его против artitary объект, но это не в моем «модуль», ни свойство в моем модуле я хотел раскрыть.

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) 

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

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

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

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

+0

Этот вопрос, как он стоит немного непонятно - вы можете затянуть его (вопросы говоря «Это хорошо?» обычно закрываются) – slifty

+0

Возможный дубликат [Имеет ли Javascript ключи/такие ключевые слова как C#?] (http://stackoverflow.com/questions/5409372/does-javascript-have-get-set-keywords -like-c) –

ответ

1

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

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

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

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


данные Descriptor: value, writable, enumerable, configurable

Пример:

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

Accessor Descriptor: get, set, enumerable, configurable

Пример:

Object.defineProperty(obj, 'prop', { 
    get: function() { return 'foo'; }, 
    set: function() { /* do something... */ }, 
    enumerable: false, 
    configurable: true 
}); 
+0

Nice информативный ответ, но, хотя это не его вопрос, это своего рода юбки, почему ОП не может использовать 'this' для' defineProperty'. – ProfK

Смежные вопросы