기본적으로 "."문자를 통해 객체의 속성에 액세스하는 것의 차이는 없습니다. 구문 또는 키를 통해.
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"
큰 차이는 브라우저가 구문을 처리하는 방식이다. here을 볼 수 있듯이, 내 친구가 몇 가지 테스트를 수행했으며 크롬과 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
방법 인스턴스 메서드이고 자바 스크립트 통역원이 방법에 대한 메모리를 할당합니다.
'새 포인트'를 만들면 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'멤버를 반환합니다. 객체의 선언에서.
위의 예에서 p
의 모든 항목은 toString
메서드가 프로토 타입에 언급 된 메서드를 가리키고 p2
의 모든 항목은 메서드의 각 복사본을 가리 킵니다. 나중에 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
'foo는. [...]'문법 오류입니다 - 아마'foo [...] '를 의미했습니다 – Christoph
사실'foo ['... ']'. 'foo [ "..."]'도 있습니다. – Thai
@Christoph 맞습니다. 지금 바로 수정하십시오. :) – Abhijit