JavaScript 대상 개요(하부)

6180 단어 js 대상 지향
구조 함수 와 원형 대상
구조 함수 도 함수 입 니 다.new 로 대상 을 만 들 때 호출 되 는 함수 입 니 다.일반 함수 와 의 차 이 는 이니셜 을 대문자 로 써 야 한 다 는 것 입 니 다.그러나 구조 함 수 를 일반 함수 로 호출 할 경우(new 키워드 가 부족 함)this 가 가리 키 는 문제 에 주의해 야 합 니 다.

var name = "Pomy";
function Per(){
  console.log("Hello "+this.name);
}
var per1 = new Per(); //"Hello undefined"
var per2 = Per();  //"Hello Pomy"
new 를 사용 할 때 이 대상 을 자동 으로 만 듭 니 다.그 유형 은 구조 함수 형식 으로 대상 인 스 턴 스 를 가리 킵 니 다.new 키워드 가 없습니다.this 는 전역 대상 을 가리 키 고 있 습 니 다.
인 스 턴 스 of 로 대상 유형 을 검사 할 수 있 으 며,모든 대상 이 생 성 할 때 하나의 constructor 속성 을 자동 으로 가지 고 있 으 며,구조 함수(글자 의 양 형식 이나 Object 구조 함수 가 만 든 대상 을 가리 키 며,Object 를 가리 키 며,사용자 정의 구조 함수 가 만 든 대상 은 구조 함 수 를 가리 키 고 있 습 니 다).

console.log(per1 instanceof Per); //true
console.log(per1.constructor === Per); //true
모든 대상 인 스 턴 스 는 내부 속성 이 있 습 니 다.[Prototype]은 이 대상 의 원형 대상 을 가리 키 고 있 습 니 다.구조 함수 자체 도 prototype 속성 이 원형 대상 을 가리 키 고 있 습 니 다.모든 생 성 대상 은 이 원형 대상 의 속성 과 방법 을 공유 합 니 다.

function Person(){}
Person.prototype.name="dwqs";
Person.prototype.age=20;
Person.prototype.sayName=function()
{
  alert(this.name);
};
var per1 = new Person();
per1.sayName(); //dwqs
var per2 = new Person();
per2.sayName(); //dwqs
alert(per1.sayName == per2.sayName); //true

따라서 실례 중의 지침 은 원형 만 가리 키 고 구조 함 수 를 가리 키 지 않 는 다.ES5 는 hasOwnProperty()와 isProperty Of()방법 을 제공 하여 원형 대상 과 인 스 턴 스 간 의 관 계 를 반영 한다.

alert(Person.prototype.isPrototypeOf(per2)); //true
per1.blog = "www.ido321.com";
alert(per1.hasOwnProperty("blog")); //true
alert(Person.prototype.hasOwnProperty("blog")); //false
alert(per1.hasOwnProperty("name")); //false
alert(Person.prototype.hasOwnProperty("name")); //true
원형 대상 의 constructor 속성 은 구조 함수 자 체 를 가리 키 기 때문에 원형 을 다시 쓸 때 constructor 속성의 지향 문 제 를 주의해 야 합 니 다.

function Hello(name){
  this.name = name;
}
//    
Hello.prototype = {
  sayHi:function(){
    console.log(this.name);
  }
};
var hi = new Hello("Pomy");
console.log(hi instanceof Hello); //true
console.log(hi.constructor === Hello); //false
console.log(hi.constructor === Object); //true
대상 글자 의 양 형식 을 사용 하여 원형 대상 을 바 꾸 어 구조 함수 의 속성 을 바 꾸 었 기 때문에 constructor 는 Hello 가 아 닌 Object 를 가리 키 고 있 습 니 다.constructor 가 가리 키 는 것 이 중요 하 다 면 원형 대상 을 바 꿀 때 constructor 속성 을 수 동 으로 초기 화 해 야 합 니 다.

Hello.prototype = {
  constructor:Hello,
  sayHi:function(){
    console.log(this.name);
  }
};
console.log(hi.constructor === Hello); //true
console.log(hi.constructor === Object); //false
원형 대상 의 특성 을 이용 하여 자 바스 크 립 트 의 내장 원형 대상 에 사용자 정의 방법 을 편리 하 게 추가 할 수 있 습 니 다.

Array.prototype.sum=function(){
  return this.reduce(function(prev,cur){
    return prev+cur;
  });
};
var num = [1,2,3,4,5,6];
var res = num.sum();
console.log(res); //21
String.prototype.capit = function(){
  return this.charAt(0).toUpperCase()+this.substring(1);
};
var msg = "hello world";
console.log(msg.capit()); //"Hello World"
이어받다
[[Prototype]특성 을 이용 하여 원형 계승 을 실현 할 수 있 습 니 다.글자 의 양 형식의 대상 에 대해 서 는 Object.prototype 을[Prototype]로 암시 적 으로 지정 할 수도 있 고 Object.create()를 통 해 지정 할 수도 있 습 니 다.두 가지 인 자 를 받 아들 일 수 있 습 니 다.첫 번 째 는[Prototype]이 가리 키 는 대상(원형 대상)이 고 두 번 째 는 선택 할 수 있 는 속성 설명 문자 대상 입 니 다.

var book = {
  title:"    ";
};
//        
var book = Object.create(Object.prototype,{
  title:{
    configurable:true,
    enumerable:true,
    value:"    ",
    wratable:true
  }
});
글자 의 대상 은 Object 에서 기본적으로 계승 되 며,더 재 미 있 는 용법 은 사용자 정의 대상 간 에 계승 을 실현 하 는 것 이다.

var book1 = {
  title:"JS      ",
  getTitle:function(){
    console.log(this.title);
  }
};
var book2 = Object.create(book1,{
  title:{
    configurable:true,
    enumerable:true,
    value:"JS    ",
    wratable:true
  }
});
book1.getTitle(); //"JS      "
book2.getTitle(); //"JS    "
console.log(book1.hasOwnProperty("getTitle")); //true
console.log(book1.isPrototypeOf("book2")); //false
console.log(book2.hasOwnProperty("getTitle")); //false
book 2 의 getTitle 속성 에 접근 할 때 자 바스 크 립 트 엔진 은 검색 과정 을 실행 합 니 다.현재 book 2 의 자체 속성 에서 찾 고 찾 으 면 사용 합 니 다.찾 지 못 하면[Prototype]을 검색 하고 찾 지 못 하면 프로 토 타 입 대상 의[Prototype]을 계승 체인 끝 까지 계속 검색 합 니 다.끝 은 보통 Object.prototype 이 고[Prototype]은 null 로 설정 되 어 있 습 니 다.
계승 을 실현 하 는 또 다른 방식 은 구조 함 수 를 이용 하 는 것 이다.모든 함수 가 쓸 수 있 는 prototype 속성 을 가지 고 있 습 니 다.기본 값 은 Object.prototype 에서 계승 하 는 것 으로 설정 되 어 있 습 니 다.변경 을 통 해 원형 체인 을 바 꿀 수 있 습 니 다.

function Rect(length,width){
  this.length = length;
  this.width = width;
}
Rect.prototype.getArea = function(){
  return this.width * this.length;
};
Rect.prototype.toString = function(){
  return "[Rect"+this.length+"*"+this.width+"]";
};
function Square(size){
  this.length = size;
  this.width = size;
}
//  prototype  
Square.prototype = new Rect();
Square.prototype.constructor = Square;
Square.prototype.toString = function(){
  return "[Square"+this.length+"*"+this.width+"]";
};
var rect = new Rect(5,10);
var square = new Square(6);
console.log(rect.getArea()); //50
console.log(square.getArea()); //36
부모 클래스 의 toString()에 접근 하려 면 다음 과 같이 할 수 있 습 니 다.

Square.prototype.toString = function(){
  var text = Rect.prototype.toString.call(this);
  return text.replace("Rect","Square");
}

좋은 웹페이지 즐겨찾기