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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  •   面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意...
    霜天晓阅读 2,139评论 0 6
  • 面向对象的语言有一个标志,那就是它们都有类的概念,而通过类可以创建任意多个具有相同属性和方法的对象。ECMAScr...
    DHFE阅读 992评论 0 4
  • 面向对象(Object-Oriented,OO)的语言有一个标志,那就是它们都有类的慨念,而通过类可以创建任意多个...
    threetowns阅读 885评论 0 4
  • 愿你有好运气 如果没有,愿你在不幸中学会慈悲 愿你被很多人爱 如果没有,愿你在寂寞中学会宽容 愿你有好运气 如果没...
    四夕清荷阅读 493评论 0 0
  • 阳光拂面,柳树微微起伏,柳絮飞过留在河流中,阳光里走来一个男孩,对面的女孩拽着自己的衣角。 “这是你的。”男孩...
    天宠流阅读 604评论 0 2