JavaScript에서 연산자의 인스턴스는 무엇입니까?
instanceof
JavaScript의 키워드는 처음 접했을 때 상당히 혼란스러울 수 있습니다. 왜냐하면 사람들은 JavaScript가 객체 지향 프로그래밍 언어가 아니라고 생각하는 경향이 있기 때문입니다.
- 그것은 무엇일까요?
- 어떤 문제가 해결됩니까?
- 언제가 적절하고 언제가 적절하지 않은가?
인스턴스
왼쪽(LHS) 피연산자는 클래스의 실제 컨스트럭터인 오른쪽(RHS) 피연산자에 대해 테스트되는 실제 객체입니다.기본 정의는 다음과 같습니다.
현재 개체를 확인하고 개체가 지정된 개체 유형인 경우 true를 반환합니다.
다음은 좋은 예시와 Mozilla 개발자 사이트에서 직접 가져온 예입니다.
var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral"; //no type specified
color2 instanceof String; // returns false (color2 is not a String object)
한 가지 언급할 가치가 있는 것은instanceof
개체가 클래스의 프로토타입에서 상속되는 경우 true로 평가됩니다.
var p = new Person("Jon");
p instanceof Person
은 ★★★★★★★★★★★★★★★★입니다.p instanceof Person
이상이다p
계승하다Person.prototype
.
OP의 요구에 따라
I've added a small example with some sample code and an explanation.변수를 선언할 때 특정 유형을 지정합니다.
예:
int i;
float f;
Customer c;
즉 '아까부터'를 몇 보여주고 있습니다.i
,f
, , , , 입니다.c
타입은 다음과 같습니다.integer
,float
가 정의한 " " "Customer
typedata type 니다다 。위와 같은 유형은 JavaScript뿐만 아니라 모든 언어에 사용할 수 있습니다.때 ", JavaScript"var x
x 는 // 수 있습니다.x , / 자 / 용용 / 용 , type type 。 뭐?instanceof
인지 아닌지를 한 타입인지 합니다.Customer
「 」 、 「 」:
var c = new Customer();
c instanceof Customer; //Returns true as c is just a customer
c instanceof String; //Returns false as c is not a string, it's a customer silly!
내용입니다.c
was was was was was was was 。Customer
새것으로 만들어서 종류인지 확인했습니다.Customer
그렇지 않으면.아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아. 그, 속, 계, 계, 계, 계, 계, then, then, then, then, then, then, then을 합니다.Customer
가 "A"인지 합니다.String
절대 String
는 새로운 것을 Customer
반대하지 않다String
false가됩니다.틀리다
정말 그렇게 간단해!
지금까지의 코멘트에서는 다루지 않았던 중요한 측면이 있습니다.즉, 상속입니다.instanceof를 사용하여 평가 중인 변수는 프로토타입 상속으로 인해 여러 "유형"에 대해 true를 반환할 수 있습니다.
예를 들어 유형 및 하위 유형을 정의합니다.
function Foo(){ //a Foo constructor
//assign some props
return this;
}
function SubFoo(){ //a SubFoo constructor
Foo.call( this ); //inherit static props
//assign some new props
return this;
}
SubFoo.prototype = Object.create(Foo.prototype); // Inherit prototype
SubFoo.prototype.constructor = SubFoo;
이제 몇 가지 "클래스"가 있습니다. 몇 가지 인스턴스를 만들고 어떤 인스턴스가 있는지 알아보겠습니다.
var
foo = new Foo()
, subfoo = new SubFoo()
;
alert(
"Q: Is foo an instance of Foo? "
+ "A: " + ( foo instanceof Foo )
); // -> true
alert(
"Q: Is foo an instance of SubFoo? "
+ "A: " + ( foo instanceof SubFoo )
); // -> false
alert(
"Q: Is subfoo an instance of Foo? "
+ "A: " + ( subfoo instanceof Foo )
); // -> true
alert(
"Q: Is subfoo an instance of SubFoo? "
+ "A: " + ( subfoo instanceof SubFoo )
); // -> true
alert(
"Q: Is subfoo an instance of Object? "
+ "A: " + ( subfoo instanceof Object )
); // -> true
마지막 줄 보이지?함수에 대한 모든 "새로운" 호출은 개체에서 상속된 개체를 반환합니다.이것은 오브젝트 작성의 속기를 사용하는 경우에도 해당됩니다.
alert(
"Q: Is {} an instance of Object? "
+ "A: " + ( {} instanceof Object )
); // -> true
"클래스" 정의 자체는 어떻습니까?어떤 인스턴스입니까?
alert(
"Q: Is Foo an instance of Object? "
+ "A:" + ( Foo instanceof Object)
); // -> true
alert(
"Q: Is Foo an instance of Function? "
+ "A:" + ( Foo instanceof Function)
); // -> true
의 인스턴스가 될 수 것이 , MULTLE로 할 수 같기 입니다.왜냐하면 당신은 (잘못된) 다음과 같은 방법으로 오브젝트와 함수를 구분할 수 있다고 생각하기 때문입니다.instanceof
이 마지막 예에서 알 수 있듯이 함수는 객체입니다.
또한 상속 패턴을 사용하고 있으며 덕 타이핑 이외의 방법으로 개체의 자손을 확인하려는 경우에도 중요합니다.
이 되었으면 .instanceof
.
알 수 instanceof
실제로 효과가 있습니다. 몇몇 언어 변호사들이 관심을 가질 수 있습니다.
JavaScript를 수 .__proto__
유 。에는 능능도 있습니다.prototype
입니다.__proto__
모든 오브젝트에 대한 정보를 제공합니다.함수에 됩니다.prototype
. 。instanceof
연산자는 이 고유성을 사용하여 답변을 제공합니다.instanceof
함수로 쓴 것처럼 보일 수도 있어요.
function instance_of(V, F) {
var O = F.prototype;
V = V.__proto__;
while (true) {
if (V === null)
return false;
if (O === V)
return true;
V = V.__proto__;
}
}
이것은 기본적으로 ECMA-262 에디션 5.1(ES5라고도 함), 섹션 15.3.5.3을 바꾸어 표현한 것입니다.
함수의 할 수 .prototype
을 할 수 .__proto__
재산이 필요합니다.이렇게 하면 다음과 같은 흥미로운 결과를 얻을 수 있습니다.
function F() { }
function G() { }
var p = {};
F.prototype = p;
G.prototype = p;
var f = new F();
var g = new G();
f instanceof F; // returns true
f instanceof G; // returns true
g instanceof F; // returns true
g instanceof G; // returns true
F.prototype = {};
f instanceof F; // returns false
g.__proto__ = {};
g instanceof G; // returns false
instanceof는 객체를 선언할 때 "new" 키워드를 사용하여 정의된다는 점에 유의해야 합니다.이 예에서는 JonH의
var color1 = new String("green");
color1 instanceof String; // returns true
var color2 = "coral";
color2 instanceof String; // returns false (color2 is not a String object)
그가 언급하지 않은 것은 이것이다.
var color1 = String("green");
color1 instanceof String; // returns false
"new"를 지정하면 문자열 생성자 함수의 종료 상태가 반환값으로 설정되는 것이 아니라 실제로 color1 var에 복사됩니다.이것은 새로운 키워드의 기능을 보다 잘 나타내고 있다고 생각합니다.
function Test(name){
this.test = function(){
return 'This will only work through the "new" keyword.';
}
return name;
}
var test = new Test('test');
test.test(); // returns 'This will only work through the "new" keyword.'
test // returns the instance object of the Test() function.
var test = Test('test');
test.test(); // throws TypeError: Object #<Test> has no method 'test'
test // returns 'test'
"new"를 사용하면 함수 내부의 "this" 값이 선언된 변수에 할당되고 사용하지 않으면 반환 값이 대신 할당됩니다.
또한 다음과 같이 오류 처리 및 디버깅에 사용할 수 있습니다.
try{
somefunction();
}
catch(error){
if (error instanceof TypeError) {
// Handle type Error
} else if (error instanceof ReferenceError) {
// Handle ReferenceError
} else {
// Handle all other error types
}
}
그것은 무엇일까요?
자바스크립트instanceof
: 함수의 ''가 있는지 합니다.prototype
는 propertypee에 .__proto__
즉, 오브젝트라고 가정하면 같은 것입니다.
obj instanceof testObj;
- 합니다.
obj.__proto__ === testObj.prototype
> > > 의true
instanceof
true
. - '하다'와 같이요.
obj.__proto__.__proto__ === testObj.prototype
> > > 의true
instanceof
true
. - 개체의 전체 프로토타입을 검사할 때까지 2단계를 반복합니다. 하지 않는
testObj.prototype
instanceof
됩니다.false
.
예제:
function Person(name) {
this.name = name;
}
var me = new Person('Willem');
console.log(me instanceof Person); // true
// because: me.__proto__ === Person.prototype // evaluates true
console.log(me instanceof Object); // true
// because: me.__proto__.__proto__ === Object.prototype // evaluates true
console.log(me instanceof Array); // false
// because: Array is nowhere on the prototype chain
어떤 문제가 해결됩니까?
어떤 물체가 특정 프로토타입에서 파생된 것인지 편리하게 확인하는 문제를 해결했다.예를 들어, 함수가 다양한 프로토타입을 가질 수 있는 객체를 수신하는 경우.원형 사슬의 에 먼저 하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다, 사용하다.instanceof
하여 이러한 확인합니다.
예:
function Person1 (name) {
this.name = name;
}
function Person2 (name) {
this.name = name;
}
Person1.prototype.talkP1 = function () {
console.log('Person 1 talking');
}
Person2.prototype.talkP2 = function () {
console.log('Person 2 talking');
}
function talk (person) {
if (person instanceof Person1) {
person.talkP1();
}
if (person instanceof Person2) {
person.talkP2();
}
}
const pers1 = new Person1 ('p1');
const pers2 = new Person2 ('p2');
talk(pers1);
talk(pers2);
★★★★★★★★★★★★★★★★★★에talk()
시제품이 객체에 있는지 먼저 확인합니다.그런 다음 실행할 적절한 방법을 선택합니다.이 검사를 수행하지 않으면 존재하지 않는 메서드가 실행되어 참조 오류가 발생할 수 있습니다.
언제가 적절하고 언제가 적절하지 않은가?
이미 얘기했잖아요오브젝트로 작업을 수행하기 전에 오브젝트의 프로토타입을 확인해야 할 때 사용합니다.
//Vehicle is a function. But by naming conventions
//(first letter is uppercase), it is also an object
//constructor function ("class").
function Vehicle(numWheels) {
this.numWheels = numWheels;
}
//We can create new instances and check their types.
myRoadster = new Vehicle(4);
alert(myRoadster instanceof Vehicle);
"언제 적절하고 언제 적절하지 않은가?"라는 질문에 대해 나의 2센트
instanceof
는 프로덕션 코드에서는 거의 도움이 되지 않지만 코드가 올바른 유형의 개체를 반환/작성하는 테스트에서 유용합니다.코드가 반환/작성하는 객체의 종류를 명시함으로써 코드를 이해하고 문서화하는 도구로서 테스트가 더욱 강력해집니다.
저는 이제 막 실제 애플리케이션을 발견했고 앞으로 더 자주 사용할 것입니다.
jQuery 이벤트를 사용하는 경우 이벤트 없이 직접 호출할 수도 있는 보다 일반적인 함수를 작성할 수 있습니다.하시면 됩니다.instanceof
의 첫 가 ''인지를 확인합니다.jQuery.Event
적절하게 반응합니다.
var myFunction = function (el) {
if (el instanceof $.Event)
// event specific code
else
// generic code
};
$('button').click(recalc); // Will execute event specific code
recalc('myParameter'); // Will execute generic code
제 경우, 이 함수는 (버튼 클릭 이벤트를 통해) 모두를 위해 무언가를 계산하거나 특정 요소를 하나만 계산해야 했습니다.사용한 코드:
var recalc = function (el) {
el = (el == undefined || el instanceof $.Event) ? $('span.allItems') : $(el);
// calculate...
};
instanceof
isPrototypeOf
:
function Ctor() {}
var o = new Ctor();
o instanceof Ctor; // true
Ctor.prototype.isPrototypeOf(o); // true
o instanceof Ctor === Ctor.prototype.isPrototypeOf(o); // equivalent
instanceof
단지 물건의 제작자의 프로토타입에 의존할 뿐입니다.
컨스트럭터는 그냥 일반적인 함수입니다.Javascript에서는 모든 것이 객체이기 때문에 엄밀히 말하면 함수 객체입니다.그리고 이 기능 오브젝트는 프로토타입을 가지고 있습니다. 왜냐하면 모든 기능에는 프로토타입을 가지고 있기 때문입니다.
프로토타입은 다른 물체의 프로토타입 체인 안에 위치한 일반적인 물체입니다.즉, 다른 물체의 프로토타입 체인에 있는 것이 프로토타입에 대한 객체를 만듭니다.
function f() {} // ordinary function
var o = {}, // ordinary object
p;
f.prototype = o; // oops, o is a prototype now
p = new f(); // oops, f is a constructor now
o.isPrototypeOf(p); // true
p instanceof f; // true
instanceof
연산자는 Javascript에 존재하지 않는 클래스를 위조하기 때문에 피해야 합니다.★★★★★★★★★★★에도 불구하고class
도 ES2015 이후 class
다시 이 됩니다 그건 다른하지만 그건 다른 이야기이다.
@SebastianSimon 내 마지막 대답은 8살이다(laming 했을 때). 그리고 내가 황소*히트를 썼을 가능성이 있다:)
- 하고 있는 은 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★instanceof
★★★★★★★★★★★★★★를 사용하고 있는 경우입니다.class
인스턴스와 동작은 받는 클래스에 따라 달라집니다.404 에러 A(에러 A) 에러 B(에러 B) 에러 B(에러 B).라이브러리 응답 코드가 혼란스러웠지만 다행히 다른 오류 클래스를 사용하여 느려졌습니다.
(현재는) 기본 요소를 반영하는 유형을 확인하는 데 사용하지 않습니다. 라이브러리가 반환되는지 확인할 수 없습니다.'msg'
★★★★★★★★★★★★★★★★★」new String('msg')
.
두 방법 모두 다음 중 하나에 속하는 방법을 가지고 있습니다.String
이유는 'class'입니다.'msg'
.내부적으로는 통역에 의한 것입니다. 다 theyStrings
instanceof
한 것 것이 하기 위해 합니다.typeof
& & &instanceof
JS JS에서 반환된 입니다.
는 이 Currenty TypeScript에서는 이러한 .typeof
★★★★★★★★★★★★★★★★★」instanceof
.
언급URL : https://stackoverflow.com/questions/2449254/what-is-the-instanceof-operator-in-javascript
'programing' 카테고리의 다른 글
Jasmine JavaScript 테스트 - 목표와 목표의 비교 (0) | 2022.09.17 |
---|---|
npm install --legacy-peer-deps는 정확히 무엇을 합니까?언제가 권장됩니까? / 어떤 사용 사례가 있을 수 있습니까? (0) | 2022.09.17 |
-Xmx3G를 사용하여 "VM 초기화 중 오류가 발생했습니다. 개체 힙에 충분한 공간을 예약할 수 없습니다." (0) | 2022.09.17 |
MySQL에 어레이를 저장하는 방법 (0) | 2022.09.17 |
javascript의 get Month는 전달을 나타냅니다. (0) | 2022.09.17 |