2010.03.26(2)——javascript 02

2010.03.26(2)——javascript 02
참고:http://www.iteye.com/topic/19748#119140

1.prototype 원형
prototype 은 대상 의 대상 속성 입 니 다.이 속성 은 대상 의 모든 인 스 턴 스 가 공유 하 는 모든 속성 과 방법 을 포함 합 니 다.prototype 기본 값 은 하나의 constructor 속성 만 포함 하고 이 속성 은 대상 에 대응 하 는 구조 함 수 를 가리 키 고 있 습 니 다.
프로 토 타 입 속성 을 추가 하 는 방법,대상 명.prototype.속성 명,prototype 은 대상 명 으로 만 접근 할 수 있 기 때문에 Object()와 대상 의 직접 양 을 사용 하 는 방법 으로 프로 토 타 입 속성 을 정의 할 수 없습니다.
Object()의 방법
var student = new Object();
student.name="ff";
student.age = 23;

대상 직접 량
var student = {name:"ff",age:23};

그들 은 모두 대상 설명 이 아니 라 직접 정의 한 대상 인 스 턴 스 이다.
function Student(){
	this.name = "xiaodu";
	this.age = 23;
	this.f1 = function(){alert("hehe");};
}

var s1 = new Student(); //      
Student.prototype.sex = "woman";//      sex
Student.prototype.f2 = function(){alert("haha");};
alert(s1.age);
var s2 = new Student();
alert(s2.age);

원형 속성 은 모든 대상 인 스 턴 스 가 공유 하 는 것 입 니 다.

2.원형 에 기초 한 계승
function People(){
	this.country = "china";
	this.language = "hanyu";
}

Student.prototype = new People();//Student   People
alert(s1.country);
alert(s2.language);

대상 A 의 구조 함 수 를 대상 B 의 prototype 속성 에 부여 할 때 대상 B 는 대상 A 를 계승 하고 대상 B 는 대상 A 에서 정의 하 는 모든 속성 과 방법 이 있 습 니 다.
대상 B 가 정의 한 속성 과 대상 A 의 이름 이 같 으 면 대상 B 가 계승 한 속성 이 덮어 쓰 거나 숨겨 집 니 다.

3.
<
SCRIPT LANGUAGE="JavaScript">   
Object.prototype.toString = function () { return  'myToString'} ; //         ,                 ,									//            Object    
function  Person(){   
  
} 
var  o = new  Person();   
o.name = 'zkj';   
o.age = 25 ;   
o.desc = function ()  { return  '  :' + this .name + ',  :' + this .age} ;   
 for ( var  key  in  o)  {   
    alert(key + ':' + o[key] + ' type:' + typeof (o[key]));   
  if ( typeof (o[key]) == 'function') {   
        alert('    key:' + (o[key])());   
 }    
}    
alert(o); 
alert( new  Date());  
</SCRIPT>

alert(o)는 사실 o.toString()을 실행 하고 결 과 를'my ToString'으로 되 돌려 줍 니 다.
Object.prototype.toString=function(){return  'myToString'} ; 주석 이 있 으 면 결 과 를 되 돌려 주 는 것 은?  [object Object]
여기 서 나 는 다음 과 같은 몇 가지 문 제 를 제기 하고 싶다.
    a.javascript 대상 도 하나의 계승 대상 이지 만 모든 대상 이 Object 에서 계승 하 는 것 은 아 닙 니 다.예 를 들 어 Date 대상 입 니 다.
    b.Object.prototype 원형 대상 을 함부로 정의 하지 마 세 요.prototype.js 에 extends 를 추가 하여 반나절 동안 말 을 들 었 다.그러나 우리 스스로 라 이브 러 리 를 쓸 때 Object 의 prototype 을 고 치 려 고 하지 마 세 요.
    c.자바 script 언어 로 자바 를 모방 하여 코드 를 쓰 지 마 세 요.위의 것 을 생각 하려 면 person 의'클래스'가 필요 합 니 다.하 나 를 정의 하지 않 아 도 되 는 것 이 아 닙 니 다.자바 script 대상 의 속성 은 임의로 증가 하거나 삭제 할 수 있 습 니 다.자바 처럼 클래스 에 죽음 을 쓰 지 않 습 니 다.
    d.쉽게 말 하면 person 이 Object'류'를 물 려 받 았 다 고 할 수 있다.javascript 에서 대상 의 계승 은 prototype 으로 이 루어 집 니 다.나중에 prototype 원형 대상 을 토론 합 니 다.
    e.그러면 우리 가 응용 할 때 자신의 구조 함수(예 를 들 어 person)를 스스로 정의 해 야 합 니까?아니면 Object 를 직접 사용 해 야 합 니까?이것 은 복잡 한 문제 입 니 다.저 는 개인 적 으로 Object 를 많이 사용 하 는 것 을 좋아 합 니 다.

4.Object function new Object()new Function()간 의 관계
<SCRIPT LANGUAGE="JavaScript">   
Person.type = " person " ;   
Person.writeType = function ()  {   
    document.writeln( this .type);   
}    
 // var Person = function(){}//         ,        ,      。    
  function  Person()  {}    
Person.writeType();   
alert( typeof (Person));   
 for ( var  key  in  Person)  {   
    alert(key);
}    
 var  person = new  Person();   
</SCRIPT>
  :
function
type
writeType
protoType

여기 서 Person 은 함수 이지 만 속성(type)을 정의 할 수 있 습 니 다.한편,Person 은 Object 인 스 턴 스 의 특성(for in,속성 을 정의 할 수 있 음)이 있 지만 Person 은 Object 의 인 스 턴 스 가 아 닙 니 다.예 를 들 어
<SCRIPT LANGUAGE="JavaScript">   
Object.prototype.toString = function ()  { return  'myToString'} ;   
 function  Person()  {   
  
}    
 Person.prototype.toString = function ()  { return  'Person'} ;   
  
 var  o = new  Person();   
alert(o);   
alert(Person)   
Person.toString = function ()  { return  'Person toString'} ;   
alert(Person);   
alert(o);
</SCRIPT>

결과:
Person
function Person() {
}
Person toString
Person
function 이 돌아 오 는 데이터 형식 은 Object 와 같은 등급 의 데이터 형식 이라는 것 을 이해 합 니 다.Object 인 스 턴 스(new Object()의 일부 특성 이 있 지만 Object 의 인 스 턴 스 가 아 닙 니 다.Object.prototype.toString=function(){return'my ToString'}을 계승 하지 않 았 기 때 문 입 니 다.
결론:
Object              function              function      ,  (for in) 

new Object()        new function()        new function()  Object prototype,    function prototype 


5.prototype 재해 석
<SCRIPT LANGUAGE="JavaScript">   
  var  Person = function  ()  {   
     this .name = 'Person        name';   
     this .getName = function ()  {   
     return   this .name;   
 }    
  // this.toString=function(){}  //              
 }    
Person.name = " Person " ;   
Person.toString = function ()  { return   this .name + '    '} ; //     this     
alert(Person.toString()); //        
var  o = new  Person();   
alert(o.getName()); //             
alert(o); //   toString          ==>     ==>Person prototype ==>Object prototype     
Object.prototype.toString = function ()  { return  'Object prototype  toString'} ;   
alert(o); // Object prototype     
Person.prototype.toString = function ()  { return  'Person prototpe  toString'} ;   
alert(o);   
o.toString = function ()  { return  '    toString    '}    
alert(o);   
alert('        toString 。   super   !');   //                 。      。
</SCRIPT>

4
  :
Person     
Person        name
[object Object]                      //undefined
Object prototype  toString        //undefined
Person prototpe  toString         //undefined
제 가 toString 방법 을 커버 했 네요.
나 는 앞의 toString 에 접근 할 수 없다.슈퍼 가 있 었 으 면 좋 겠 다.
toString 접근 방법   대상 찾기 중==>구조 함수 중=>Person 의 prototype 중=>Object 의 prototype 중
프로 토 타 입 대상 prototype 은 Object 또는 같은 등급 의 대상(function,Number)의 속성 이 며,prototype 은 대상 입 니 다.type:of 의 값 은 object 입 니 다.
사용자 정의'클래스'중 몇 군데 가 속성 을 정의 할 수 있 습 니 다.
   a.함수 이름 에서 직접 정의 합 니 다.  Person.name 과 같 습 니 다.이 정 의 는 클래스 이름 에 해당 하 는 속성 입 니 다.정적,접근 할 때 Person.name 으로 접근 해 야 합 니 다.new Person().name 으로 접근 할 수 없고 접근 할 수 없습니다.
   b.구조 함수 의 this.중.new function()을 사용 할 때 이 속성 들 은 당신 이 가지 고 있 는 대상 의 속성 입 니 다.new Person().속성 으로  방문 하 러 오다.
   c.대상 을 구축 한 후 대상 에 게 속성 을 증가 합 니 다.구조 함수 의 속성 사용 과 유사 합 니 다.
   d.함수 이름 의 prototype 에서
   e,부모 클래스 또는 Object 의 prototype 에서
(1)대상 속성 우선 순위
다음 코드 를 실행 함으로써 방문 대상 속성 우선 순 위 는 다음 과 같 습 니 다:c>b>d>e
c 가지 속성 은 정 의 된 후에 방문 해 야 유효 합 니 다.a 종 속성 실례 에 접근 할 수 없습니다.
javascrpt 언어 가 미리 정 의 된 속성 은 for in 으로 얻 을 수 없습니다.toString
<SCRIPT LANGUAGE="JavaScript">   
  Object.prototype.toString = function () {} ;   
Object.prototype.name = " Object " ;   
Object.prototype.porotype_name = " oObject " ;   
Object.prototype.parent_name = " pObject " ;   
  
Person.prototype.name = " Person " ;   
Person.prototype.porotype_name = " oPerson " ;   
 function  Person()  {   
     this .name = 'Person  ';   
}    
 var  o = new  Person();   
 for ( var  key  in  o)  {   
    alert(key + ':' + o[key]);   
}
</SCRIPT>

(2)prototype 속성 은 읽 기 전용 입 니 다.
다음 코드 를 보 세 요.변 수 를 통 해 원형 대상 의 속성 을 바 꾸 려 고 하지 마 세 요.당신 도 바 꿀 수 없습니다.당신 은 c 모드 를 통 해 대상 에 게 속성 을 추가 할 수 있 습 니 다.
또한 원형 대상 은 모든 인 스 턴 스 가 공유 합 니 다.이론 적 으로 도 바 꿀 수 없다.
<SCRIPT LANGUAGE="JavaScript">   
Person.prototype.name = " Person " ;   
 function  Person() {   
     
}    
 var  o = new  Person();   
 var  o1 = new  Person();   
alert('o.name:' + o.name + '  ' + 'o1.name:' + o1.name);   
o.name = 'zkj';   
alert('o.name:' + o.name + '  ' + 'o1.name:' + o1.name);
</SCRIPT>


6.상속
자 바스 크 립 트 의 계승 은 시 뮬 레이 션 으로 이 루어 졌 다 고 말 할 수 밖 에 없습니다.자바,c++와 는 달리 prototype 에 의 해 이 루어 집 니 다.
저 는 개인 적 으로 자 바스 크 립 트 의'계승'을 사용 하지 않 습 니 다.자 바스 크 립 트 가 실현 한 계승 은 진정한 계승 이 아니 라 고 생각 합 니 다.자바 의 독 해 를 많이 받 았 나 봐 요.
javascript 에서 저 는 계승 을 두 가지 로 나 누 었 습 니 다.계승,대상 계승.
a.prototype.js 의 클래스 계승
<SCRIPT LANGUAGE="JavaScript">   
Object.extend  =   function (destination, source)   {   
   for  (prototype in  source)   {   
    destination[prototype]  =  source[prototype];//     ,prototype          ,         
  }    
   return  destination;   
}    
    
  function  Man()  {   
     this .name = 'zkj';   
}    
Man.prototype.type = '  ';   
Man.prototype.getType = function ()  {   
     return   this .type;   
}    
  function  Woman()  {}    
    
Object.extend(Woman.prototype,Man.prototype);   
 var  man = new  Man(); 
 var  woman = new  Woman();  
alert(man.getType());  
alert(man.name);   
alert(woman.getType());   
alert(woman.name);
</SCRIPT>
  :
  
zkj
  
undefined

이러한 계승 방법 은 prototype 의 속성 과 방법 을 계승 하 는 것 이다.
그리고 Student.prototype=new People()이라는 계승 방법 은 모든 속성 과 방법 을 계승 하 는 것 이다.
이상 의 코드 를 보면 아마 너 는 알 것 이다.직접 복사 류 의 원형 대상 은 확실히 어떤 개념 적 계승 을 실현 할 수 있다.
그러나 주의:계승 시스템 에서 Man 의 원형 대상 속성 방법 은 Man 의 인 스 턴 스 속성(name)을 사용 하지 않 는 것 이 좋 습 니 다.Woman 에서 인 스 턴 스 속성 name 을 정의 하지 않 았 을 수도 있 습 니 다.또한 Man)프로 토 타 입 대상 속성 필드(type)를 사용 하지 않 는 것 이 좋 습 니 다.type 도 복사 되 었 지만 값 은'남자'입 니 다.
해결 방법 이 있 지만 자 바스 크 립 트 는 좋 은 문법 검사 도구 가 없습니다.prototype.js 클래스 를 계승 할 때 조심 하 십시오.

좋은 웹페이지 즐겨찾기