2010.03.26(2)——javascript 02
11410 단어 JavaScriptC++cprototypeC#
참고: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 클래스 를 계승 할 때 조심 하 십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
기초 정리 - 1문자 (String) 숫자 (Number) 불린 (Boolean) null undefined 심볼 (Symbol) 큰정수 (BigInt) 따옴표로 묶어 있어야 함 Not-A-Number - 숫자 데이터 / 숫자로 표...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.