원형 원형 체인, 속성의 확장

10174 단어

원형 및 원형 체인


원형

  • 모든 는 은식 원형 프로토 속성을 가지고 있다
  • 모든 는 은식 원형 프로토 속성을 가지고 있다(맞다)
  • 모든 는 현식 원형prototype 속성을 가지고 있다(틀림)
  • 모든 는 현식 원형prototype 속성을 가지고 있다(맞다)
  • 속성값: 원형 대상
  • prototype는 빈 Object 대상을 가리킨다(틀렸다)
  • 모든 prototype__proto__는 Object의prototype(맞아)
  • 을 가리킨다

    위수조를 진수조로 전환 & 변수가 진수조인지 아닌지 어떻게 판단합니까

  • 그것은 Array에서 왔다.prototype에서push(), pop(),sort(),slice(),splice() 등 전속적인 방법을 계승하였는데 이런 방법은 위수조와 Object 대상에 없습니다.
  • slice 방법은 처음부터 끝까지 선택한 그룹의 일부분을 새 그룹의 대상으로 복사합니다.원래 배열은 수정되지 않습니다.
  • obj instanceof Array는 수조 여부를 판단할 수 있다
  •     var arr = {length:3,0:"a",1:"b",2:"c"};
            arr.push('d');//   
            var arr2 = Array.prototype.slice.call(arr);
            arr2.push("d")
            console.log(arr2)
    

    기본값

  • Array.prototype은 빈 그룹을 가리킨다
  • Function.prototype은 빈 Function
  • 을 가리킵니다.
  • map() 방법으로 새 그룹을 만들었는데 그 결과는 이 그룹의 모든 요소가 제공된 함수를 호출한 후에 되돌아오는 결과입니다.
  • join() 방법은 수조(또는 하나의 클래스 수조 대상)의 모든 요소를 문자열에 연결합니다.
  •     function test(arr,fn){
                arr =arr||Array.prototype;
                fn =fn||Function.prototype;
    
                return arr.map(fn).join(" ");
            }
            console.log(test());
    

    ==의 사용 규칙

  • 참조 데이터 유형을 비교할 때
  • 자체의valueof()를 먼저 호출하고valueof 방법이 되돌아오는 기본 데이터 형식을 직접 비교
  • valueof()가 기본 데이터 형식이 아닌 경우 비교 대상 자체의 tostring()
  • 를 호출합니다
  • 기본 데이터를 비교하는 경우:
  • number()를 통해number 유형으로 전환한 후 비교
  •   // [""] valueof [""]
         [""].tostring() ""
         number() 0
      console.log([""]==false)//true
    
      // 
      Array.prototype.valueof = function(){
        return 1;
      }
      console.log([""]==flase)//false
    

    원형 체인의 계승

  • 아날로그 jQuery의 html()on()
  • jQuery의 체인 호출 읽기와 쓰기 합성을 나타낸다
  •   //    new Element()---> dom 
      function Element(id){
           this.ele = document.getElementById(id);
        }
    
        Element.prototype.innerText= function(val){
           var ele = this.ele;
           if(val){
             ele.innerText = val;
             return this;// 
           }else{
             return ele.innerText;
           }
         }
    
       Element.prototype.on = function(val,fn){
                var ele = this.ele;
                if(ele.addEventListener){
                    ele.addEventListener(val,fn);
                    return this
                }
            }
    
         var textNode = new Element("test");
         textNode.innerText("text")// 
         textNode.innerText("text").innerText()// 
         console.log(textNode.innerText("text").innerText())// 
    
         textNode.on("click",function(){
                alert(1);
            }).innerText('text')
    

    종합 면접 문제

        // 
            // 
            // 
            //this
            // 
            // 
    
            function getName() {
                alert (5);
            }
            function Foo() {
                getName = function () { alert (1); };
                return this;
            }
    
            Foo.getName = function () {
                alert (2);
            };
            Foo.prototype.getName = function () {
                alert (3);
            };
            var getName = function () {
                alert (4);
            };
    
            Foo.getName(); //2
            getName();//4
            Foo().getName(); //1
            getName(); //1
            new Foo.getName(); //2
            new Foo().getName()//3
    

    원형 & 원형 체인

  • 원형 대상: 빈 Object 대상은 아니지만, 그 프로토는 Object의 프로토타입
  • 을 영원히 가리킨다
  • 원형 체인의 머리
  •     Object.prototype.__proto__===>null
            Function.__proto__ === Function.prototype
            Object.__proto__  === Function.prototype
            Function.prototype.__proto__ === Object.prototype
            Object.prototype.__proto__=== null
    

    javascript의 속성


    변수 찾기

  • 왼쪽 조회, 오른쪽 조회
  • 속성 설명자(메타 속성)

  • 수식 속성의 속성(원속성)
  • 해당 속성에 대한 설명자 가져오기
  • Object.getOwnPropertyDescriptor(obj,"name") 첫 번째 매개 변수: 대응하는 대상;두 번째 매개 변수: 대응하는 대상의 속성
  • writable 속성을 수정할 수 있는지 여부를 결정합니다.
  • 일반적으로value와 함께 귀속
  • writable가false일 때 대응하는 속성의 값은 수정할 수 없습니다.기본값: 계속 수정하면 엄격한 모드에서 오류 보고
  • configurable로 속성 구성 가능 여부 결정
  • 삭제 가능 여부
  • configurable:true 삭제 가능configurable:false 삭제 불가
  • 속성을 다시 정의할 수 있는 설명자 configurable:true 다시 설정할 수 있습니다 configurable:false writable 다시 설정할 수 있습니다true에서false로 변경할 수 있습니다 다른 두 속성은 움직일 수 없습니다
  •     var damu={};
            Object.defineProperty(damu,"age",{
                value:18,
                writable:true
            })
    
            Object.defineProperty(damu,"age",{
                value:19,
                configurable:true// 
            })
        console.log(damu)//age:19
    
  •     var a=3;
            b=4;
    
            console.log(Object.getOwnPropertyDescriptor(window,"a"))
            console.log(Object.getOwnPropertyDescriptor(window,"b"))
    
            delete a;//a configurable:false 
            delete b;//b configurable:true 
    
            console.log(a)//3
            console.log(b)// 
    
  • enumerable 매거가능: 대상의 for in 순환에 나타날 수 있는지
  • 속성 매거 가능 여부 판단( )obj.propertyIsEnumerable("a")
  • 열거 가능한 속성 목록 획득( )Object.keys(obj)
  • 모든 속성의 목록 가져오기( )Object.getOwnPropertyNames(obj)
  •     var damu={};
            Object.defineProperty(damu,"a",{
                enumerable:false
            })
            Object.defineProperty(damu,"b",{
                enumerable:true
            })
            Object.defineProperty(damu,"c",{
                enumerable:true
            })
            Object.defineProperty(damu,"d",{
                enumerable:true
            })
            Object.defineProperty(damu,"e",{
                enumerable:false
            })
            Object.defineProperty(damu,"f",{
                enumerable:false
            })
    
        for(item in damu){
                console.log(item);// b,c,d
            }
    
            for(item in damu){
                if(damu.hasOwnProperty(item)){
                    console.log(item);
                }
            }
    
        Object.defineProperty(Object.prototype,"text",{
          value:"text"
            enumerable:true
        })
        console.log(damu.text)//text 
    
        console.log(damu.propertyIsEnumerable("f"))//false
        console.log(damu.propertyIsEnumerable("text"))//false 
        console.log(Object.keys(damu));// ( )
        console.log(Object.getOwnPropertyNames)// ( )
    

    객체 속성을 정의하는 두 가지 방법

  • (개체를 쉽게 정의할 수 있음)
  • 기본 속성 설명자는 모두 true
  •     var damu={
                wife:"zdy"
            }
            damu.wife="fbb";
        console.log(damu);
    
  • 일반 정의
  • 기본 속성 설명자는 모두 false
  •     var damu={}
            Object.defineProperty(damu,"age",{
                value:18
            })
            console.log(damu);
    

    대상의 불변성


    객체의 상수 속성

  • 속성의 writableconfigurable를false
  • 로 설정

    객체 확장 금지

  • Object.preventExtensions(obj) 단일 객체 수신
  • 밀봉 대상

  • Object 확장을 금지합니다.preventExtensions(obj)를 토대로 기존 속성의configurable를false
  • 로 조정
  • 호출Object.seal(obj) 대상을 밀봉
  • 밀봉 후 대상의 속성 확장을 금지하고 기존의 속성은 다시 정의하거나 삭제할 수 없지만 속성 값은 수정할 수 있음
  • 빙결 대상

  • 밀봉 대상(Object.seal(obj))을 토대로 기존 속성의 writable를false
  • 로 조정
  • 호출Object.freeze(obj) 대상을 밀봉
  • 동결 후 대상의 속성 확장을 금지하고 기존의 속성은 다시 정의하거나 삭제할 수 없고 속성 값은 수정할 수 없음
  • 객체 깊이 동결

  • js에서!!!모든 방법의 창설은 얕고 변형되지 않으며 그들은 목표 대상과 그의 직접 속성에만 영향을 미친다
  • 일반 프로젝트에서 대상을 깊이 동결하지 않는다
  • 깊이 동결 대상을 사용할 때 for in 계속 순환
  •     var obj={
                hoddy:{
                    hoddy1:"a",
                    hoddy2:"b",
                    hoddy3:"c",
                    hoddy4:"d",
                    hoddy5:"e"
                }
            };
    
            Object.freeze(obj);
            obj.hoddy.hoddy1 = "g"//hoddy1 
            console.log(obj)
    
        for(item in obj){
          Object.freeze(obj[item]);
        }
    

    존재성 검사

  • in"a" in obj
  • hasOwnProperty(원형 체인을 옮겨다니지 않고 대상에서만 찾음)obj.hasOwnProperty("a")
  • 액세스 설명자

  • 속성 정의setget 또는 둘 다 때때로 이 속성은
  • 로 정의됩니다.
  • 액세스 설명자에 대해 자바스크립트는 그들의 value writable 특성을 무시합니다.대신 set과 get 함수입니다.
  • value writableset get는 한 조
  • 만 가능
  • 액세스 설명자는 우리가 속성에 대해 값을 부여하는 작업을 할 때 논리를 미리 변경할 수 있다(예를 들어if else)
  • 액세스 설명자는 우리의 속성을 더욱 안전하게 할 수 있습니다!!!포장
  • 총결산

  • 속성 설명자가 속성을 수식하는 데 사용하는 속성(원속성) 5개
  • 데이터 묘사부호는 writable와value 속성 묘사부호의 속성을 가지고 있기 때문에 우리는 데이터 묘사부호
  • 라고 부른다
  • 액세스 설명자는 set과 get 속성 설명자의 속성을 가지고 있기 때문에 우리는 액세스 설명자
  • 라고 부른다
  • writable가true인 데이터 설명자
  • 속성 찾기: 실례 대상의 직접 속성에서 대응하는 속성을 찾지 못하면 원형 체인을 찾습니다. 전체 원형 체인에 이 속성이 없으면undefined
  • 로 돌아갑니다.
  • 속성의 설정: 어떤 경우에도 설정 작업은 대상의 직접 속성에만 영향을 미친다

  • 속성 찾기

  • 대상에서 같은 이름의 속성을 찾았는지 찾으면 이 속성의 값을 되돌려줍니다.
  • 찾지 못하면 원형 체인
  • 을 옮겨다니기
  • 아무리 찾아도 찾지 못하고undefined
  • 로 돌아갑니다.

    속성 설정

  • 만약에 속성이 대상에 직접 존재하고 원형 체인에 존재하지 않는다면(또는 속성이 대상에도 직접 존재하고 원형 체인에도 존재한다면) 대상에 직접 존재하는 속성을 찾습니다.
  • 데이터 설명자(setter/getter 없음): 대상의 속성을 직접 수정하는 값(writbale의 값 주의)
  • 액세스 설명자: set 방법을 직접 호출
  • 객체의 원형 체인에 속성이 직접 존재하지 않는 경우
  • 이 속성은 데이터 설명자입니다 (setter/getter 없음)
  • writbale는true로 대상에 직접 속성을 추가합니다. 우리는 차단속성
  • 이라고 부릅니다.
  • writbale는false 오류로 차단 속성이 생성되지 않습니다
  • 이 속성은 액세스 설명자 호출set으로 차단 속성을 생성하지 않습니다
  • 속성이 대상에 직접 존재하지 않거나 원형 체인에 있지 않으면 대상의 직접 속성에 속성(데이터 설명자)을 추가한다
  • 좋은 웹페이지 즐겨찾기