в принципе, нет разницы между доступом к свойству объекта через "."синтаксис или с помощью ключа.
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