2013-10-03 3 views
1

인기있는 블로그에서 저자는 JavaScript에 대한 "아 하!"의 순간을 청중에게 물었고 대부분의 사람들은 JavaScript의 모든 것이 객체라는 것을 깨닫고 있다고 말했습니다. 그러나 JS와 프로그래밍에 익숙하지 않은 나는 일반적으로 그 의미를 알지 못합니다. 실제 JS 객체와 관련이있는 솔기가 없습니다. - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object모든 것이 개체입니까?

그렇지 않습니까?

"JavaScript의 모든 것이 객체"라는 것이 무엇을 의미하는지 설명해주십시오.

일반적으로 OO 프로그래밍에 관한 것이므로이 주제에 대해 읽는 것이 도움이 될 것입니다. 이 주제에 관해 읽을 내용을 권할 수 있습니까?

+5

JavaScript의 모든 것이 객체라는 것은 사실이 아닙니다. – Pointy

+0

많은 OOP에서 대부분의 것들이 어떤 형태로'Object'를 확장합니다. – Rogue

+1

속성과 같은 객체를 가질 수있는 더 많은 것들 (http://stackoverflow.com/a/6394872/16959)은 객체처럼 취급 할 수 있다는 것을 의미하지 않아야합니다. –

답변

5

첫 번째 원칙으로 돌아갑니다.

개체는 무엇입니까? 상태와 동작을 메모리의 단일 엔티티로 함께 캡슐화하는 소프트웨어 구성 요소입니다.

이 정의를 통해 모든 것을 객체로 생각할 수 있습니다. 기능적 프로그래머는 함수를 first class 객체로 만듭니다. 데이터 사용자는 데이터가 동작하지 않아도 객체라고 생각할 수 있습니다 (매우 똑똑하지는 않지만).

이 변경 내용이 표시되지 않습니다.

JavaScript는 함수를 객체로 취급합니다.

이 통찰력이 프로그래밍에 어떤 영향을 미칠지 잘 모르겠습니다.

+0

이것은 모두 사실이지만 JavaScript에서는 문자열, 부울 및 숫자가 객체가 아니기 때문에 "모든 것이 객체"라고 말하는 것이 잘못되었습니다. – Pointy

+0

충분히 좋습니다. Java에는 프리미티브도 있습니다. 무엇이 바뀌나요? 나는 그게별로 중요하지 않다. – duffymo

+3

"모든 것"이 대상이되는 것을 신경 쓰는 것이 중요합니다. (개인적으로는 그렇지 않습니다.) – Pointy

7

변수에 할당 할 수있는 데이터는 유행과 같이 개체에서 액세스 할 수있는 속성 (따라서 메서드)을 가지고 있다는 것을 의미합니다.

// strings 
"asdf".length;    // 4 
"asdf".replace('f', 'zxc'); // "azxc" 

// numbers 
(10).toFixed(2);   // "10.00" 

// booleans 
true.someProp;    // undefined (point is it doesn't crash) 

이들은 상속받은 프로토 타입을 가지고 있습니다.

"omg".constructor;   // function String() { [native code] } 
String.prototype.snazzify = function() { 
    return "*!*!*" + this + "*!*!*"; 
}; 

"omg".snazzify();   // "*!*!*omg*!*!*" 

그러나, 이러한 기본 요소이며, 그들은 많은 방법처럼 객체를 작동하는 동안, 그들은 몇 가지 다른 "진짜"JS 객체 다릅니다. 그 중 가장 큰 것은 불변이라는 것이다. 기능 실제 변경 가능한 객체가 있다고하지만

var s = "qwerty"; 
s.foo;    // undefined, but does not crash 
s.foo = 'some val'; // try to add a property to the string 
s.foo;    // still undefined, you cannot modify a primitive 

주의 마십시오.

var fn = function(){}; 
fn.foo;    // undefined 
fn.foo = 'some val'; // try to add a property to the function 
fn.foo;    // "some val" 

그래서 "JS의 모든 개체는"것을 기술적으로 사실이 아니다 동안, 대부분의 경우 당신은 대부분 그들이 속성과 메소드를 가지고 있다는 점에서 객체처럼 취급 할 수 있으며, 잠재적으로 확장 할 수 있습니다. 주의 사항을 이해했는지 확인하십시오.

+0

문자열이나 숫자 같은 프리미티브는 어떤 프로퍼티 나 메소드도 가지고 있지 않습니다. 캐릭터 라인에'.length'를 실행하면 (자), JavaScript는 프리미티브를 둘러싸는 일시적인 오브젝트 래퍼를 작성해, 그 오브젝트 래퍼의'length' property에 액세스합니다. 이것은 autoboxing으로 알려져 있습니다. – d4nyll

0

ALMOST MAIN 코드 단위가 JS 개체이기 때문에 모든 것이 '개체입니다.' 프리미티브에서 모든 객체와 같이 멤버를 추가 할 수는 없습니다.JS-기능 여기 JS-객체 왜 내 대답은 : 자바 스크립트에서 https://stackoverflow.com/a/24811539

0

NOT everything in JavaScript is an object.

모든 데이터는 1 ~ 6의 기본 유형 또는 객체 유형에 해당해야합니다. 기본 유형에는 부울, null, undefined, 문자열, 숫자 및 기호가 포함됩니다. 프리미티브가 아닌 것은 모두입니다.

이것은 함수가 객체이고, 배열이 객체이며, 객체 인 함수로 분리 된 ES6 클래스를 의미합니다.

원시 값에 개체 래퍼이 있으므로 혼란이 발생합니다. 문자열 리터럴의 length 속성에 액세스하려고하면 JavaScript가 기본 객체 주위에 임시 객체 래퍼를 만들고 해당 객체 래퍼의 length 속성에 액세스합니다. 특성을 검색 한 후에는 오브젝트 래퍼를 버립니다. 이것은 autoboxing으로 알려져 있습니다.

const foo = "bar"; 

// When you run `foo.length`, it's similar to 
tmp = String(foo); 
tmp.length; 
delete tmp; 

또는

const foo = "bar"; 
(new String(foo)).length; 

문자열, 숫자 및 부울 프리미티브 객체 래퍼를 가지고 있지만, nullundefined 그렇지 않은 :

기본적으로는 다음과 유사한 구현됩니다. 따라서 해당 프리미티브에서 속성이나 메서드에 액세스하려고하면 오류가 발생합니다.

null.length; // Uncaught TypeError: Cannot read property 'length' of null 
undefined.length; // Uncaught TypeError: Cannot read property 'length' of undefined 
관련 문제