구조 함수 2

2341 단어
먼저 하나의 예를 보십시오.
function Foo(){

}
Foo.prototype.constructor === Foo//true
var obj = new Foo()
obj.constructor === Foo//true

함수의prototype 대상에constructor 속성이 있습니다. 이 속성의 기본값은 현재 함수입니다.obj 대상이 왜 constructor에 접근할 수 있는지에 대해서는 앞서 언급한 대상의 [[Prototype]에 대한 지식을 되돌아봐야 한다.obj의 [[Prototype]] 속성이 가리키는 값은 Foo 함수이기 때문에 obj 자체에서 어떤 속성을 찾을 수 없을 때 원형 체인에서 찾습니다.

1. 구조 함수와 일반 호출의 혼합


하나의 함수가 구조 함수인지 아닌지는 쓰기와 관계가 없다.호출 방식과 관계가 있다.
  • 만약에 우리가 일반 함수 호출 앞에 new 키워드를 붙이면 이 함수 호출을 하나의 구조 함수 호출로 변환한다. 만약에 그 전에 그 함수가return이 없었다면 구조 함수 다음에 {}을 되돌려주고 이 대상의 [[[[Prototype]] 속성은 일반 함수의prototype 대상을 가리킨다:
  • function fun(){
     console.log("?")
    }
    var obj = new fun()
    console.log(obj)//fun {}
    console.log(Object.getPrototypeOf(obj) === fun.prototype)//true
    

    이 기능을 통해 데이터를 공유할 수 있습니다.
    function fun(){}
    fun.prototype.a = "haha"
    var obj = new fun()
    var obj2 = new fun()
    console.log(obj.a)//"haha"
    console.log(obj2.a)//"haha"
    console.log(Object.getOwnPropertyDescriptor(fun.prototype, "a"))//"writable":true...
    obj.a = "self"
    console.log(obj.a)//"self"
    console.log(obj2.a)//"haha"
    
  • 만약에 우리가 일반적인 함수 호출 앞에 new 키워드를 붙이면 이 함수 호출을 하나의 구조 함수 호출로 바꿀 것이다. 만약에 이전의 함수가return의 대상이었다면 구조 함수가 된 후에 되돌아오는 내용은 변하지 않을 것이다.그러나 되돌아오는 이 대상은 일반 함수의prototype 대상에 의뢰되지 않고 Object에 의뢰됩니다.prototype에서 의뢰합니다.그래서 이때 new는 아무런 작용도 하지 않은 셈이다.
  • funtion foo(){
     return {"w": 9}
    }
    var obj = new foo()
    console.log(obj)//{"w": 9}
    console.log(Object.getOwnPrototypeOf(obj) == Object.prototype)//true
    
  • 만약에 일반 함수가return 문장을 가지고 있지만return의 내용이 대상이 아니라면 이 일반 함수 앞에 new 키워드를 추가하면 이 함수 호출을 구조 함수 호출로 바꾼다.이 때 빈 대상을 되돌려주고 이 빈 대상은 함수의prototype 대상에게 의뢰됩니다:
  • function foo(){
      return 1
    }
    var obj = new foo()
    console.log(obj)//foo {}
    console.log(Object.getPrototypeOf(obj) == foo.prototype)//true
    

    주의해야 할 것은 여기서 말하는 비 대상은 어떤 것들입니까? 예를 들어 수치, 문자열, 볼 값 등입니다.어떤 것이 안 됩니까? 예를 들면, 수조, 함수 등입니다.
  • '구조 함수'를 호출할 때 new 방식을 추가하지 않으면 일반 함수로 호출됩니다.이 때 되돌아오는 것은undefined입니다.
  • function foo(){
       this. a = 1
    }
    var obj = foo()
    console.log(obj)//undefined
    // undefined, 。
    

    물론 규범에 따라 솔직하게 쓰면 그 위에 개뿔도 만나지 않을 것이다.

    END

    좋은 웹페이지 즐겨찾기