Разница между свойством доступа и свойством данных в ECMAScript?

Спецификация ECMAScript версии 5 вводит новый тип свойств, называемых свойствами доступа. По сравнению с существующим и известным типом свойств, называемых свойствами данных, как эти две вещи связаны друг с другом, только с точки зрения спецификации?

Я прочитал спецификацию ECMAScript v5, и мне не ясна точная разница. Может ли кто-нибудь объяснить два примера кода? Я искал в Интернете, но все примеры кажутся расплывчатыми.


person ringord    schedule 12.04.2015    source источник
comment
Вы хоть пытались прочитать об этом, прежде чем просить кого-нибудь здесь повторить то, что написано в спецификации?   -  person Touffy    schedule 12.04.2015
comment
@Touffy Да, я прочитал спецификацию ecmascript, но я до сих пор не понимаю, как свойство доступа может хранить данные без атрибута значения, а также разницу между свойством данных и свойством доступа.   -  person ringord    schedule 12.04.2015
comment
См. developer.mozilla.org/en/docs. /Интернет/JavaScript/Справочник/   -  person Fabrício Matté    schedule 12.04.2015
comment
Просто перейдите сюда и посмотрите на код jsperf.com/data-vs- аксессор-против-геттер-сеттер/2   -  person Haseeb Asif    schedule 12.04.2015
comment
В том-то и дело: он не содержит никаких данных, вместо этого он определяет поведение при доступе к свойству. Попробуйте использовать и поиграть с примерами, чтобы лучше понять.   -  person Touffy    schedule 12.04.2015
comment
@Touffy Но как частные свойства (вещи, начинающиеся с _ (подчеркивание) могут иметь атрибуты получения и установки?   -  person ringord    schedule 12.04.2015
comment
@beli проверь мой ответ. обратите внимание, что _ (подчеркивание) не делает ваши поля закрытыми. вы должны объявить свои поля с помощью var внутри функции конструктора, только так ваши поля будут действительно приватными!   -  person João Pinho    schedule 12.04.2015
comment
см. также Что такое функция доступа?   -  person Bergi    schedule 12.04.2015


Ответы (1)


Именованное свойство данных связывает имя со значением. Это означает, что вы используете это свойство для прямого получения и извлечения данных, как общедоступное поле в классе.

Именованное свойство средства доступа связывает имя с одной или двумя функциями средства доступа. Функции доступа используются для хранения или извлечения значения, связанного со свойством. Это означает, что вы ограничиваете доступ к определенному значению за свойством доступа get и/или set.

Сравнивая оба варианта, первый вариант не дает вам инкапсуляции или контроля над тем, как осуществляется доступ к вашему значению. Второй позволяет указать, может ли ваше значение быть прочитано «получить доступ», написано «установить доступ» или и то, и другое.

ОБНОВЛЕНИЕ

Что касается вашего вторичного сомнения (в комментариях), вот небольшой и быстрый 101 по основам Ecma Script, который я только что приготовил;):

// accounting namespace
var Accounting = {};

// client class definition
Accounting.Client = function(){
    // private fields
    var _address="";
    var _phone=0;

    // data property
    this.token = "";

    // privileged properties
    Object.defineProperty(this, "address", {
        get: function(){
            if(console) console.log('hey im using get address accessor property.');        
            return _address;
        },
        set: function(value){
            if(console) console.log('hey im using set address accessor property.');

            if(value == null)
                throw new Error('Field address cannot be null!');

            _address=value;
        }
    });

    Object.defineProperty(this, "phone", {
        get: function(){
            if(console) console.log('hey im using get phone accessor property.');
            return _phone;
        },
        set: function(value){
            if(console) console.log('hey im using set phone accessor property.');
            _phone=value;
        }
    });
};

Accounting.Client.prototype = {
    sayHello: function(){
        alert("hello im a shared function, which means im shared by all objects of type Client"
              + " and i do not have access to private fields :(.");
    }
};


/* use case */
var c1 = new Accounting.Client();
c1.address = "Rua da Capela";
c1.phone = 961909090;
c1["token"] = "mytoken in a data property";
c1.token = c1.token + "-111";

alert("client address is '" + c1.address + "' and his phone also is '" + c1.phone + "'.");
c1.sayHello();    
alert(c1.token);

try{
    // check non nullable field.
    c1.address=null;
}
catch(ex){
    alert(ex);
}

Поэкспериментируйте с моим jsfiddle!

Удачного кодирования!

person João Pinho    schedule 12.04.2015