JS의 prototype 기초편
function HiClass() {
this.sayHi = function(){
alert("hi");
}
}
var obj = new HiClass();
alert(HiClass.prototype);//outputs [object, object]
alert(obj.prototype);//outputs undefined
프로토타입 방식으로 하나의 클래스를 계승할 때 다른 프로토타입 방식에 추가될 수 있는 속성과 방법을 주의해야 합니다.하이클래스라면prototype.prop = 'value';하이클래스에서.prototype = new HelloClass();이전에 HiClass를 실행합니다.prototype = new HelloClass();이후 HiClass의 실례에는 prop 속성이 없습니다. 이것은 이해하기 쉽습니다.그러나 코드에 이런 버그가 조심하지 않도록 주의해야 한다.
function HiClass() {
this.sayHi = function(){
alert("hi");
}
}
function HelloClass() {
this.sayHello = function(){
alert("hello");
}
}
//HiClass.prototype.prop = 'value';
HiClass.prototype = new HelloClass();
HiClass.prototype.prop = 'value';
var obj = new HiClass();
obj.sayHello();
alert(obj.prop);
자바스크립트에 프로토타입 체인이 있습니다. 대상의 실례에 대한 호출 방법이나 속성을 얻을 때 실례에 대응하는 클래스가 대응하는 정의가 있는지 확인하고, 없으면 프로토타입 체인을 따라 계속 찾습니다. 찾을 수 없으면 undefined입니다.
function Object2() {
this.sayHi = function(){
alert("hi Object2");
}
}
function Object3() {
this.sayHi = function(){
alert("hi Object3");
this.sayHello = function(){
alert("hello Object3");
}
}
Object2.prototype = new Object3();
var obj = new Object2();
obj.sayHi();
obj.sayHello();
Object.prototype.foo = function(){
alert("f00 Object");
};
obj.foo();
obj를 호출합니다.sayHi();때sayHi는 Object2에서 정의되었고 그 자체의 정의를 호출합니다.
obj를 호출합니다.sayHello();때sayHello는 Object2에 정의되지 않았지만prototype이 Object3를 가리키기 때문에 Object3에서 찾아 실행을 찾았습니다.
obj를 호출합니다.foo();때sayHello는 Object2와 Object3에 정의가 없지만 JS의 모든 실례가 Object를 계승하기 때문에 Object의prototype에서foo를 찾아서 실행할 수 있습니다.
만약에 실례에 추가된 속성과 방법이prototype의 속성과 방법과 이름이 바뀌면 실례와prototype에 비해 이 속성과 방법이 있습니다. 단지 프로토타입 체인의 접근 순서 때문에 실례의 속성과 방법에 먼저 접근합니다.hasOwnProperty() 방법을 사용하면 하나의 속성이 실례에 존재하는지 원형에 존재하는지 확인할 수 있습니다. 아래의 예에서 설명한 바와 같습니다.
function Test(){};
Test.prototype.prop1 = 'prop value';
var obj = new Test();
obj.prop1 = 'instance value';
alert(obj.prop1 );//outputs instance value
alert(obj.hasOwnProperty("prop1"));//outputs true
delete obj.prop1;alert(obj.prop1 ); //outputs prop value
alert(obj.hasOwnProperty("prop1"));//outputs false
alert("prop1" in obj);//outputs true
delete Test.prototype.prop1;alert(obj.prop1 );//outputs undefined
function TestCls(){
}
TestCls.prototype = {
prop1:'value1',
prop2:'value2'
};
myObj = new TestCls();
alert(myObj.prop2);
원형과 in 조작부호
두 가지 방식으로 IN 조작부호를 사용합니다. 단독으로 사용하고 for-in 순환에서 사용합니다. 단독으로 사용할 때 in조작부호는 대상을 통해 속성에 접근할 때true를 되돌려줍니다. 이 속성이 원형이든 실례든 상관없습니다.
function Person()
{
}
Person.prototype.name="jerry";
Person.prototype.age=29;
Person.prototype.sayName=function(){
alert(this.name)
}
var person1=new Person();
var person2=new Person();
alert(person1.hasOwnProperty("name")) // false
alert("name" in person1) //true
person1.name="fdsfdsf";
alert(person1.property("name")) ;// true
alert("name" in person1); // true
상기 코드를 통해 알 수 있듯이name 속성은 대상에 직접 접근한 것이거나 원형을 통해 접근한 것이 아니라면 IN 접근 대상 속성을 사용하여 항상 TRUE를 되돌려줍니다. 따라서 in 조작부호가 대상을 통해 접근할 수 있는 속성만 되돌려주면true를 되돌려주고 HarOwnProperty를 통해false를 되돌려주면 속성이 원형의 속성임을 확정할 수 있습니다.
function hasPrototypePropetype(object,name) // ,
{
return !object.hasOwnPropetype(name)&&(name in object);
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.