oop 타이틀 - Javascript의 거의 모든 것이 객체입니까?



자바 변경 (5)

많은 JavaScript 소개에서이 내용을 많이 읽었습니다. 나는 그것을 이해하지 못한다. 나는 항상 객체를 메서드와 속성을 가진 무언가로 생각합니다. 배열은 키 값 쌍을 가지고 있기 때문에 이해합니다. "문자열"또는 "숫자"또는 "함수"는 어떻습니까? 위에 열거 된 것들은 나와 같은 기능인 것처럼 보입니다. 이것은 당신이 무언가를 입력한다는 것을 의미합니다. 당신은 실제로 액세스 속성이나 아무것도 얻지 못합니다. 배열이나 객체 목록에 도트 표기법이 없습니다.

누구도 해당 메서드 및 속성에 액세스하는 도트 표기법을 사용하여 이러한 각각의 예제를 코딩합니까? JavaScript에 대해 배우기 시작한 이래로 객체 정의가 제한적이라고 생각합니다 ...


Answers

맞습니다. 자바 스크립트에서는 거의 모든 것이 객체입니다. 그러나 이러한 객체는 자바, C ++ 또는 기타 일반 언어에서 보는 것과는 조금 다릅니다. JS의 객체는 단순히 키 - 값 쌍이있는 해시 맵입니다. 키는 항상 문자열이며, 값은 문자열, 정수, 부울, 함수, 다른 객체 등을 포함하는 모든 값이 될 수 있습니다. 따라서 다음과 같이 새 객체를 만들 수 있습니다.

var obj = {}; // this is not the only way to create an object in JS

새로운 키 - 값 쌍을 추가하십시오.

obj['message'] = 'Hello'; // you can always attach new properties to an object externally

또는

obj.message = 'Hello';

마찬가지로이 객체에 새 함수를 추가하려면 다음과 같이하십시오.

obj['showMessage'] = function(){
    alert(this['message']);
}

또는

obj.showMessage = function() {
    alert(this.message);
}

이제이 함수를 호출 할 때마다 메시지가있는 팝업이 표시됩니다.

obj.showMessage();

배열은 단순히 값 목록을 포함 할 수있는 객체입니다.

var arr = [32, 33, 34, 35]; // one way of creating arrays in JS

모든 객체를 사용하여 값을 저장할 수 있지만 배열을 사용하면 각 객체에 키를 연결하지 않고 저장할 수 있습니다. 따라서 색인을 사용하여 항목에 액세스 할 수 있습니다.

alert(arr[1]); // this would show 33

배열 객체는 JS의 다른 객체와 마찬가지로 다음과 같은 속성을가집니다.

alert(arr.length); // this would show 4

자세한 내용은 John Resig의 Pro Javascript Techniques를 강력히 추천합니다.


모든 것이 자바 스크립트의 객체는 아닙니다. JavaScript에는 프리미티브와 객체가 있습니다. null, undefined, string, number, boolean 및 symbol의 6 가지 기본 요소가 있습니다. 액세스 할 수있는 속성 및 기능 때문에 모든 것이 객체로 작동하는 것처럼 보일 수 있습니다. 예를 들어,

var stringvar="this string";
typeof stringvar; // "string"
stringvar.length; //11

이제 "stringvar"는 기본 유형 인 문자열 유형이므로 property.length에 액세스 할 수 없어야합니다. Boxing.Boxing은 원시 유형이 Object 유형으로 변환되는 프로세스이기 때문에 수행 할 수 있습니다. 이러한 객체 유형 또는 객체 래퍼는 프리미티브 값으로 수행해야 할 수있는 몇 가지 공통 연산이 있다는 관점에서 생성됩니다.이 객체 유형 또는 객체 래퍼는 유용한 메소드와 속성을 포함하며 프리미티브에 프로토 타입이 연결되어 있습니다. 객체에 관한 한, 키 값 쌍을 모든 객체, 심지어 배열에 추가 할 수 있습니다.

var arr=[1,2,3];
arr.name="my array";
arr;  //[1,2,3,name:'my array']

배열의 네 번째 요소가 "name : 'my array'"라는 것을 의미하지는 않습니다. "name"은 점 표기법 (arr.name) 또는 대괄호 표기법 (arr [ "name"])으로 호출 할 수있는 속성입니다. .


아니요, 모든 것이 자바 스크립트의 객체입니다. 당신이 규칙적으로 상호 작용하는 많은 것들 (문자열, 숫자, 부울)은 객체가 아닌 기본 요소입니다. 오브젝트와 달리, 원시 값은 변경 불가능합니다. 이러한 프리미티브에는 객체 래퍼 ( String , NumberBoolean )가 있으므로 상황이 복잡합니다. 이러한 객체는 메소드와 속성을 가지지 만 프리미티브는 메소드를 가지고있는 것처럼 보입니다. 왜냐하면 자바 스크립트는 코드가 프리미티브의 모든 속성에 액세스하려고 할 때 자동으로 래퍼 객체를 생성하기 때문입니다.

예를 들어 다음 코드를 생각해보십시오.

var s = "foo";
var sub = s.substring(1, 2); // sub is now the string "o"

장면 뒤에서 s.substring(1, 2) 은 마치 다음 단계 (대략적인)를 수행하는 것처럼 동작합니다.

  1. new String(s) 사용과 동일한 s 에서 래퍼 String 객체를 만듭니다.
  2. 1 단계에서 반환 된 String 객체의 적절한 매개 변수를 사용하여 substring() 메서드를 호출합니다.
  3. String 객체의 파기
  4. 2 단계에서 문자열 (프리미티브)을 반환합니다.

결과적으로 프리 머 티브에 속성을 할당 할 수있는 것처럼 보이지만 검색 할 수 없으므로 무의미합니다.

var s = "foo";
s.bar = "cheese";
alert(s.bar); // undefined

이것은 즉시 파기되는 String 객체에 속성이 효과적으로 정의되기 때문에 발생합니다.

숫자와 부울은 또한 이런 식으로 행동합니다. 그러나 함수는 본격적인 객체이며 Object (실제로 Object.prototype 이지만 다른 주제입니다)에서 상속받습니다. 따라서 함수는 속성을 포함하여 객체가 할 수있는 모든 것을 할 수 있습니다.

function foo() {}
foo.bar = "tea";
alert(foo.bar); // tea

MAIN 코드 단위 (객체, 함수, 배열)가 JavaScript 객체이기 때문에 "JavaScript에서 ALMOST 모든 것이 객체입니다"라는 문장이 정확합니다.
JavaScript 코드는 9 개의 다른 단위와 1 (다중)을 사용합니다.
- 01. 배열
- 02. 부울
- 03. 기능
- 04. null
- 05. 번호
- 06. 개체
- 07. 정규 표현식
- 08. string
- 09. 정의되지 않음
- 10. 복수

하지만 JavaScript 개체 :
- 다른 객체 지향 언어에서 '객체'와 같은 생물이 아닙니다.
- 이름 - 값 쌍의 모음입니다.
- 모두 창조의 기능을 가진다 (생성자).
- 모두 생성자의 프로토 타입 객체의 멤버를 INHERIT하지 않으며 프로토 타입입니다.
- 모든 기능은 객체이지만 모든 객체가 기능은 아닙니다 .
- 기능에는 범위, 객체가 없습니다 (제 생각에는 설계 상 결함이 있습니다).
개체, 함수, 배열, 문자열, ... 첫 번째 대문자로 함수입니다 !!!
- 공통점보다 JS 객체와 기능의 차이점이 더 중요합니다.
- JS에서 이름 '인스턴스'는 인스턴스가 일반 개념의 속성을 상속하는 지식 이론에서 '인스턴스'라는 이름과 다른 의미를 갖습니다. JS에서는 해당 생성자 만 나타냅니다. JavaScript는 'class-based-inheritance'ool (java)에서 'instance'라는 이름을 얻었습니다.이 객체는 클래스의 속성을 상속하기 때문에 적절한 이름입니다.
JS- 키워드 'instanceof'의 더 좋은 이름은 'objectof'입니다.

JS 함수는 다음과 같은 이유로 JS 객체 입니다.
1) JS 객체와 같은 멤버를 가질 수 있습니다.

    > function f(){}
    undefined
    > f.s = "a string"
    "a string"
    > f.s
    "a string"

2) 그들은 모든 JS- 객체와 마찬가지로 constructor-function, Function 함수를가집니다.

    > (function f(){}) instanceof Function
    true

3) 모든 JS 객체로, 그들의 프로토 타입 객체는 그 생성자 프로토 타입과 동일합니다 :

    > (function f(){}).__proto__ === Function.prototype
    true
    > ({}).__proto__ === Object.prototype
    true
    > (new Object).__proto__ === Object.prototype
    true

4) 물론 JS-objects는 SPECIFIC JS 객체와 추가 속성을 가지고 있습니다. 프로그래밍 언어의 모든 함수처럼 JS 객체는 입력 및 출력 정보로 호출 (실행) 할 수 없다는 것입니다.

EVERYTHING 은 객체가 아닙니다. 예를 들어 리터럴 문자열에 멤버를 추가 할 수 없기 때문입니다.

    > var s = "string"
    undefined
    > s.s2 = "s2string"
    "s2string"
    > s.s2
    undefined

업데이트 : @orip은 주석에서 언급 했으므로 2008 년에 링크 된 벤치 마크가 수행되었으므로 최신 브라우저에서는 결과가 적절하지 않을 수 있습니다. 그러나 어쨌든 비 현대적인 브라우저를 지원하려면이 기능이 필요하며 이후로 업데이트되지 않았을 것입니다. 항상 스스로 테스트 해보십시오.

다른 사람들이 말했듯이 배열을 통한 반복이 가장 좋은 방법 일 수 있지만 JavaScript에서 반복 while 루프가 가장 빠른 방법 이라고 입증되었습니다 . 따라서 다음과 같이 코드를 다시 작성해야 할 수 있습니다.

function contains(a, obj) {
    var i = a.length;
    while (i--) {
       if (a[i] === obj) {
           return true;
       }
    }
    return false;
}

물론 배열 프로토 타입을 확장 할 수도 있습니다.

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] === obj) {
            return true;
        }
    }
    return false;
}

이제 다음과 같이 간단하게 사용할 수 있습니다.

alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false




javascript oop