В javascript, при создании свойств, какой правильный путь или лучший синтаксис? - PullRequest
2 голосов
/ 19 января 2011

свойства (ключи) могут быть доступны и установлены с использованием точечной нотации, а также в квадратных скобках.любой совет, когда использовать точечный прототип синтаксиса

var myObj = {};   
myObj.myProp1 = 'value1'; //works, an expando property   
myObj[myProp2] = 'value2'; // FAILS, myProp2 is undefined
myObj["myProp2"] = 'value2'; // works, an expando property
myObj[2010]= 'value'; //note the key is number, still works, an expando property??   
myObj.2010 = 'value'; // FAILS. to use dot notation, key must be a string

myObj.prototype.myProp3 = 'value3' // whats the advantage?

Ответы [ 6 ]

4 голосов
/ 19 января 2011

При использовании точечного синтаксиса имя свойства является идентификатором:

var myObj = {};
myObj.myProp1 = "value1";
myObj.myProp2 = "value2";

Поскольку имя свойства должно соответствовать правилам именования идентификаторов, оно может, например, не начинаться с цифры.

При использовании синтаксиса в скобках имя свойства представляет собой строку:

var myObj = {};
myObj["myProp1"] = "value1";
myObj["myProp2"] = "value2";

В скобках может использоваться переменная или выражение любого типа, которое приводит к строке:

var myObj = {};
var prop1 = "myProp1";
myObj[prop1] = "value1";
myObj["myProp" + 2] = "value2";

Если вы используете число в качестве имени свойства, оно будет автоматически преобразовано в строку, поэтому у них будет тот же результат:

myObj[2010] = "value";
myObj["2010"] = "value";

Вы также можете использовать литерал объекта для установкизначения:

var myObj = { myProp1: "value1", myProp2: "value2" };

(Обратите внимание, что {} также является литералом объекта, только без свойств.)

Использование прототипа объекта полезно только в том случае, если у вас есть именованные типы объектов (или иным образом назначить прототип объекту).Когда вы создаете объекты с использованием литерала объекта, каждый объект имеет свой собственный прототип, поэтому помещение чего-либо в прототип имеет тот же эффект, что и помещение этого объекта.

1 голос
/ 19 января 2011

в принципе, нет разницы между доступом к свойству объекта через "."синтаксис или с помощью ключа.

var obj = new function(){this.x = "value";}
alert(obj.x === obj['x']); //it will output true

Бывают случаи, когда вы не можете использовать «.»потому что имя свойства, к которому вы пытаетесь обратиться, не является допустимым именем переменной (как вы указали с помощью числового ключа):

var obj = new function(){this['my-value'] = "my value";}
alert(obj['my-value']); // it will output "my value"
alert(obj.my-value); // it will trigger an exception , because the javascript 
//interpretor interprets "obj.my-value" as the 
//property "my" of obj minus the variable "value"

Большая разница в том, как браузер обрабатывает ваш синтаксис.Как вы можете видеть здесь , мой друг провел некоторое тестирование, и кажется, что Chrome и IE работают намного быстрее с точечным синтаксисом, в то время как Firefox и Safari более "заинтересованы" в синтаксисе ключа.
В заключение, вы можете использовать почти каждый раз любой из них, хотя бывают ситуации, когда "."приходит немного «неподготовленным».

О синтаксисе прототипа, хорошо, когда вы определяете объект, вы можете присоединять члены к каждому экземпляру, но вы также можете прикреплять члены к прототипу объекта, то есть всякий раз, когдаСоздается новый объект определенного вами типа, он автоматически наследует этот член от своего прототипа.Я думаю, это лучше понять на примере:

function Point(x,y){this.x = x;this.y = y;}
Point.prototype.toString = function(){
  return "I am a point with my x coord at "+this.x+" and my y coord at "+this.y;
}

function Point2(x,y){
  this.x = x;
  this.y = y;
  this.toString = function(){
    return "I'm a point too.I'm at x:"+this.x+", y:"+this.y;
  };
}

Когда вы создаете new Point2, это toString метод, метод экземпляра, а интерпретатор javascript выделяет память для этого метода.
Когда вы создаете«новая точка», метод toString будет связан со свойством прототипа.Это означает, что для этого метода не выделяется память.

var p = [], p2 = [];
for(var i = 0; i < 100000000; i++)
   {
     p.push(new Point(0,0));
     p2.push(new Point2(0,0));
   }

Если вы проверите это, вы увидите, что оба объекта работают отлично, но ваши Point2 объекты будут занимать немного больше памяти из вашей системы.Почему это так?
Дело в том, что когда вы вызываете метод new Point() toString(), объект понимает, что у него нет члена с именем "toString", и начинает искать его в своем прототипе.chain и возвращает член 'toString', найденный в объявлении объекта.
В приведенном выше примере все элементы p будут указывать свой метод toString на метод, упомянутый в прототипе, тогда как все *Элементы 1029 * будут указывать на каждую копию метода.
Кроме того, если позже вы захотите изменить метод toString, его будет очень легко изменить для всех экземпляров Point:
Point.prototype.toString = function(){return "I'm a smarter point";}; После этого каждый экземпляр new Point будет возвращать «Я умнее», когда вы вызываете метод toString.
Если вы попытаетесь изменить его для экземпляров Point2, этонемного сложнее.Вы обнаружите, что Point2.toString = function(){return "I'm a dumber point";} не будет работать должным образом, вам придется вручную изменить метод для каждого экземпляра:

for(var i in p2)
  p2[i].toString = function(){return "I'm a dumber point";};

Я дам вам решить, какой метод лучше: P

1 голос
/ 19 января 2011

Для меня это зависит от того, как я буду использовать объект.

Если я собираюсь использовать его как ассоциативный массив, хэш-карту или где точечный синтаксис был бы невозможен, я использую[ и ].

Однако, если я отношусь к ним как к объекту, я использую синтаксис ..

1 голос
/ 19 января 2011

В вашем случае myObj.prototype.myProp3 = 'value3' следует использовать , а не , потому что у литералов объектов нет прототипов. Да, они есть, но у них нет свойства prototype (вы увидите, что myObj.prototype не определено).

Прототипы используются в функциях для установки свойств по умолчанию для всех объектов, созданных из этой функции, с использованием ключевого слова new. Он не предназначен для назначения свойств отдельным объектам.

1 голос
/ 19 января 2011
var myObj = function () {

};
myObj.prototype.myProp3 = 'value3' // whats the advantage?

Это следует использовать, если вы хотите использовать myObj в качестве конструкции для создания нескольких объектов.то есть

var obj1 = new myObj();

, тогда obj1 также получит свойство myProp3

edit: отредактировал приведенный выше пример.чтобы использовать myObj в качестве конструктора, он должен быть объявлен как функция

1 голос
/ 19 января 2011

Свойство должно быть либо myObj.myProp, либо myObj["myProp"].Это идеальный сценарий и хорошая практика при использовании в javascript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...