2015-04-12 3 views
5

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

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

+2

Вы даже пытались прочитать об этом, прежде чем просить кого-нибудь здесь повторить то, что говорит спецификация? – Touffy

+0

@Touffy Да, я читаю спецификацию ecacccript, но я до сих пор не понимаю, как свойство accessor может хранить данные без атрибута value и разницы между свойством data и свойством accessor. – ringord

+0

См. Https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Description –

ответ

8

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

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

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

UPDATE

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

// 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 поиграть!

Счастливое кодирование!

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