Object.prototype.isPrototypeOf()
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2015å¹´7æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
isPrototypeOf() 㯠Object ã¤ã³ã¹ã¿ã³ã¹ã®ã¡ã½ããã§ããªãã¸ã§ã¯ããå¥ã®ãªãã¸ã§ã¯ãã®ãããã¿ã¤ããã§ã¼ã³ã«åå¨ãããã©ãããå¤å®ãã¾ãã
ã¡ã¢:
isPrototypeOf() ã¯ã instanceof æ¼ç®åã¨ã¯ç°ãªãã¾ãã object instanceof AFunction ã¨ããå¼ã§ã¯ãobject ã®ãããã¿ã¤ããã§ã¼ã³ã¯ AFunction èªèº«ã§ã¯ãªããAFunction.prototype ã«å¯¾ãã¦å¤å®ããã¾ãã
試ãã¦ã¿ã¾ããã
function Foo() {}
function Bar() {}
Bar.prototype = Object.create(Foo.prototype);
const bar = new Bar();
console.log(Foo.prototype.isPrototypeOf(bar));
// äºæ³ãããçµæ: true
console.log(Bar.prototype.isPrototypeOf(bar));
// äºæ³ãããçµæ: true
æ§æ
isPrototypeOf(object)
弿°
object-
ãããã¿ã¤ããã§ã¼ã³ã®æ¤ç´¢å¯¾è±¡ã
è¿å¤
è«çå¤ã§ãå¼ã³åºããããªãã¸ã§ã¯ã (this) ã object ã®ãããã¿ã¤ããã§ã¼ã³ã«ãããã©ããã示ãã¾ãããªãã¸ã§ã¯ã this ããªãã¸ã§ã¯ãã§ãªãï¼ããªããã£ãã§ããï¼å ´å㯠false ãè¿ãã¾ãã
ä¾å¤
解説
Object.prototype ãç¶æ¿ãããã¹ã¦ã®ãªãã¸ã§ã¯ãï¼ã¤ã¾ãã null ãããã¿ã¤ããªãã¸ã§ã¯ããé¤ããã¹ã¦ï¼ã¯ã isPrototypeOf() ã¡ã½ãããç¶æ¿ãã¾ãããã®ã¡ã½ããã«ãã£ã¦ããªãã¸ã§ã¯ããä»ã®ãªãã¸ã§ã¯ãã®ãããã¿ã¤ããã§ã¼ã³ã®ä¸ã«åå¨ãããã©ããã調ã¹ããã¨ãã§ãã¾ãã弿°ã¨ãã¦æ¸¡ããã object ããªãã¸ã§ã¯ãã§ãªãï¼ã¤ã¾ãããªããã£ãã§ããï¼å ´åããã®ã¡ã½ããã¯ç´æ¥ false ãè¿ãã¾ããããã§ãªãå ´åã this å¤ã¯ãªãã¸ã§ã¯ãã«å¤æããã object ã®ãããã¿ã¤ããã§ã¼ã³ãããã§ã¼ã³ã®çµç«¯ã«éãããã this å¤ãè¦ã¤ããã¾ã§æ¢ãã¾ãã
ä¾
>isPrototypeOf ã®ä½¿ç¨
ãã®ä¾ã¯ãbaz ãªãã¸ã§ã¯ãã®ãããã¿ã¤ããã§ã¼ã³ã«ãBaz.prototype 㨠Bar.prototypeãFoo.prototypeãObject.prototype ãåå¨ãã¦ãããã¢ã§ãã
class Foo {}
class Bar extends Foo {}
class Baz extends Bar {}
const foo = new Foo();
const bar = new Bar();
const baz = new Baz();
// ãããã¿ã¤ããã§ã¼ã³:
// foo: Foo --> Object
// bar: Bar --> Foo --> Object
// baz: Baz --> Bar --> Foo --> Object
console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Baz.prototype.isPrototypeOf(bar)); // false
console.log(Baz.prototype.isPrototypeOf(foo)); // false
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(foo)); // false
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(bar)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true
isPrototypeOf() ã¡ã½ããã¯ãinstanceof æ¼ç®åã¨åæ§ã«ãç¹å®ã®ãããã¿ã¤ããã§ã¼ã³ããç¶æ¿ããããªãã¸ã§ã¯ããæ±ãã¨ãã«ã®ã¿æ©è½ããã³ã¼ããæã¤å ´åããã¨ãã°ãã®ãªãã¸ã§ã¯ãã«ç¹å®ã®ã¡ã½ãããããããã£ãåå¨ãããã¨ãä¿è¨¼ããå ´åã«ç¹ã«ä¾¿å©ã§ãã
ãã¨ãã°ãbaz ãªãã¸ã§ã¯ãã Foo.prototype ã«ç±æ¥ãã¦ãããæ¤è¨¼ãã¦ã¿ã¾ãã
if (Foo.prototype.isPrototypeOf(baz)) {
// do something safe
}
ãããã Foo.prototype ã baz ã®ãããã¿ã¤ããã§ã¼ã³ã«åå¨ããããã¨ãã£ã¦ã baz ã Foo ãã³ã³ã¹ãã©ã¯ã¿ã¼ã¨ãã¦ä½¿ç¨ãã¦ä½æãããã¨ã¯éãã¾ãããä¾ãã°ã baz ã Foo.prototype ããããã¿ã¤ãã¨ãã¦ç´æ¥å²ãå½ã¦ããã¨ãã§ãã¾ãããã®å ´åãã³ã¼ãã baz ãã Foo ã®ãã©ã¤ãã¼ããã£ã¼ã«ããèªã¿è¾¼ãã§ãã失æãã¾ãã
class Foo {
#value = "foo";
static getValue(x) {
return x.#value;
}
}
const baz = { __proto__: Foo.prototype };
if (Foo.prototype.isPrototypeOf(baz)) {
console.log(Foo.getValue(baz)); // TypeError: ã¯ã©ã¹ã宣è¨ãã¦ããªããªãã¸ã§ã¯ããããã©ã¤ãã¼ãã¡ã³ãã¼ #value ãèªã¿åããã¨ã¯ã§ãã¾ããã
}
instanceof ãåæ§ã§ãããã©ã¤ãã¼ããã£ã¼ã«ããå®å
¨ãªæ¹æ³ã§èªã¿åãå¿
è¦ãããå ´åã¯ã代ããã« in ã使ç¨ãã¦ãã©ã³ããããã§ãã¯ã¡ã½ãããæä¾ãã¦ãã ããã
class Foo {
#value = "foo";
static getValue(x) {
return x.#value;
}
static isFoo(x) {
return #value in x;
}
}
const baz = { __proto__: Foo.prototype };
if (Foo.isFoo(baz)) {
// baz 㯠Foo ã§ãªãããå®è¡ãããªã
console.log(Foo.getValue(baz));
}
仿§æ¸
| 仿§æ¸ |
|---|
| ECMAScript® 2027 Language Specification > # sec-object.prototype.isprototypeof > |