isPrototypeOf 、instanceof和 getPrototypeOf

isPrototypeOf

当调用一个构造函数创建一个新实例后,该实例的内部将包含一个指针,指向这个构造函数的原型对象。ECMA-262第5版中管这个指针叫[[Prototype]]
在所有实现中,是无法访问到[[Prototype]]的,这里就可以使用isPrototypeOf()方法来确定对象与构造函数的原型对象之间是否有这个指针存在。

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype = {
    constructor: Person,
    type: '人',
    sayHi: function () {
        alert('hi');
    }
}
function Cat(name,color) {
    this.name = name;
    this.color = color;
}
Cat.prototype = {
    constructor: Cat,
    type: '猫',
    sayHi: function () {
        alert('喵');
    }
}
var person = new Person('tom', 24);
var cat = new Cat('小灰', 'gray');

console.log(Person.prototype.isPrototypeOf(person));   // true
console.log(Cat.prototype.isPrototypeOf(cat));   // true

console.log(Person.prototype.isPrototypeOf(cat));   // false
console.log(Cat.prototype.isPrototypeOf(person));   // false
getPrototypeOf

ECMAScript 5 新增的一个方法,这个方法返回 [[Prototype]]的值,也就是对应的构造的函数的原型对象。

function Person(name, age) {
    this.name = name;
    this.age = age;
}
Person.prototype = {
    constructor: Cat,
    type: '人',
    sayHi: function () {
        alert('hi');
    }
}
function Cat(name,color) {
    this.name = name;
    this.color = color;
}
Cat.prototype = {
    constructor: Cat,
    type: '猫',
    sayHi: function () {
        alert('喵');
    }
}
var person = new Person('tom', 24);
var cat = new Cat('小灰', 'gray');

console.log(Object.getPrototypeOf(person) == Person.prototype);   // true
console.log(Object.getPrototypeOf(cat) == Cat.prototype);   // true

console.log(Object.getPrototypeOf(person) == Cat.prototype);   // false
console.log(Object.getPrototypeOf(cat) == Person.prototype);   // false
instanceof

检测一个对象的类型。
详细一点就是: 用来判断一个构造函数的prototype属性所指向的对象是否存在于另外一个要检测对象的原型链上。
用法

# 检测一个对象的类型
function Person() {

}
var person = new Person();
alert(person instanceof Person);   // true

# 继承中判断实例是否属于它的父类
function Super() {

}
function Sub() {

}
Sub.prototype = new Super();
var instance = new Sub();
console.log(instance instanceof Object);   // true
console.log(instance instanceof Super);   // true
console.log(instance instanceof Sub);   // true

你可能感兴趣的:(isPrototypeOf 、instanceof和 getPrototypeOf)