基本上,通过“。”访问对象的属性没有区别。语法或通过键。
var obj = new function(){this.x = "value";}
警报(obj.x === obj['x']);//它会输出真
有时您不能使用“。” ,因为您尝试访问的属性的名称不是有效的变量名称(正如您用数字键指出的那样):
var obj = new function(){this['my-value'] = "我的价值";}
警报(obj ['我的值']);// 它将输出“我的价值”
警报(obj.my-value);// 它会触发一个异常,因为 javascript
//解释器将“obj.my-value”解释为
//obj的属性“my”减去变量“value”
最大的区别在于浏览器处理您的语法的方式。正如您在此处看到的,我的一个朋友做了一些测试,似乎 Chrome 和 IE 使用点语法运行得更快,而 Firefox 和 Safari 更“热衷于”关键语法。
总之,您几乎每次都可以使用其中任何一个,尽管在某些情况下“。” 有点“措手不及”。
关于原型语法,好吧,当您定义一个对象时,您可以将成员附加到每个实例,但您也可以将成员附加到对象的原型,这意味着每当创建定义类型的新对象时,它将自动继承原型中的那个成员。我认为通过一个例子可以更好地理解:
函数点(x,y){this.x = x;this.y = y;}
Point.prototype.toString = function(){
return "我是一个点,我的 x 坐标在 "+this.x+",我的 y 坐标在 "+this.y;
}
函数 Point2(x,y){
这个.x = x;
这个.y = y;
this.toString = 函数(){
return "我也是一个点。我在 x:"+this.x+", y:"+this.y;
};
}
当您创建 anew Point2
时,它的toString
方法是一个实例方法,并且 javascript 解释器为此方法分配内存。
当您创建一个“新点”时,它的toString
方法将链接在它的原型属性上。这意味着没有为该方法分配内存。
变种 p = [], p2 = [];
for(var i = 0; i < 100000000; i++)
{
p.push(新点(0,0));
p2.push(new Point2(0,0));
}
如果您对此进行测试,您会发现这两个对象都运行良好,但是您的Point2
对象会从系统中占用更多内存。这是为什么?
问题是当你调用 anew Point()
的toString()
方法时,对象意识到它没有一个名为“toString”的成员,它开始在它的原型链上搜索它并返回在对象声明中找到的“toString”成员.
在上面的例子中,所有p
's 的项目都将它们的toString
方法指向原型中提到的那个,而所有p2
' 的项目都将指向它们的每个方法副本。
此外,如果您以后想修改该toString
方法,则可以很容易地为所有Point
实例修改它:
Point.prototype.toString = function(){return "I'm a smarter point";};
之后,当你调用它的方法时,每个实例new Point
都会返回“I'm a smarter point” 。
如果您尝试为实例修改它,那会有点困难。您会发现这 不会按预期工作,您必须手动更改每个实例的方法: toString
Point2
Point2.toString = function(){return "I'm a dumber point";}
for(var i in p2)
p2[i].toString = function(){return "我是个笨蛋";};
我会让你决定哪种方法更好:P