isPrototypeOf、instanceof、hasOwnProperty函数介绍

isPrototypeOf

作用:检测一个对象是否是另一个对象的原型。或者说一个对象是否被包含在另一个对象的原型链中

var p = {x:1};//定义一个原型对象
var o = Object.create(p);//使用这个原型创建一个对象
p.isPrototypeOf(o);//=>true:o继承p
Object.prototype.isPrototypeOf(p);//=> true p继承自Object.prototype

以上实例来自与《JavaScript权威指南》,简单解释一下就是每一个JavaScript对象都和原型关联,每一个对象都从原型继承属性。所有通过对象直接量创建的对象都使用Object.prototype作为他们的原型,因此p是继承自Object.prototype,因此在p的原型链中一定存在Object.prototype
上面还提到了Object.create();该方法创建一个新对象,第一个参数是这个对象的原型,所以上面创建的o对象它的原型就是p

    function Animal(){
    this.species = "动物";
 };
  var eh = new Animal();
  Animal.prototype.isPrototypeOf(eh)//=>true

以上实例是通过new创建了对象eh,使用构造函数Animalprototype作为它的原型。

综合上面的两个例子,我们发现在调用isPrototypeOf()的时候有三种方式

p.isPrototypeOf(o);//=>true
Object.prototype.isPrototypeOf(p);
 Animal.prototype.isPrototypeOf(eh)//=>true

总结一下就是:
通过Object.create()创建的对象使用第一个参数作为原型
通过对象直接量的对象使用Object.prototype作为原型
通过new创建的对象使用构造函数的prototype属性作为原型


instanceof

instanceof运算符希望左操作数是一个对象,右操作数标识对象的类。如果左侧对象是右侧类的实例,则表达式返回为true,否则返回false。

var d = new Date();
d instanceof Date;//=>true  d是Date的实例
d instanceof Object;//=>true 所有对象都是Object的实例

当通过instanceof判断一个对象是否是一个类的实例的时候,这个判断也会包含对父类的检测。尽管instanceof的右操作数是构造函数,但计算过程实际是检测了对象的继承关系。

instanceOf与isPrototypeOf简单总结

var d = new Date();
Date.prototype.isPrototypeOf(d);//=>true
d instanceof Date;//=>true
  • 如果Date.prototype是d的原型,那么d一定是Date的实例。
  • 缺点为无法同对象来获得类型,只能检测对象是否属于类名
  • 在多窗口和多框架的子页面的web应用中兼容性不佳。其中一个典型代表就是instanceof操作符不能视为一个可靠的数组检测方法。

hasOwnProperty

检测集合成员的所属关系,判断某个属性是否存在于某个对象中。可以通过in运算符,hasOwnProperty()来完成。

in运算符左侧是属性名,右侧是字符串,如果对象的自由属性或者继承属性中包含这个属性则返回true
对象的hasOwnProperty()方法用来检测给定的名字是否是对象的自由属性,如果是继承属性则返回false

    function Animal(){}//定义Animal构造函数
    Animal.prototype = {//定义Animal原型
        species:"动物",
        say:function(){
            console.log('i can say word');
        }
    }

    function Cat(name,color){//定义构造函数Cat
    this.name = name;
    this.color = color;
  }
      var F = function(){};
      F.prototype = Animal.prototype;
      Cat.prototype = new F();
      Cat.prototype.constructor = Cat;//Cat继承Animal 用F空对象作为媒介

      var eh = new Cat('lili','white');//实例化对象

      console.log('say' in eh)//=>true
      console.log('name' in eh)//=>true
      console.log('color' in eh)//=>true
      console.log('species' in eh)=>true

      console.log(eh.hasOwnProperty('say'))=>false  由于say为继承属性  非自有属性
      console.log(eh.hasOwnProperty('species'))=>false 由于species为继承属性  非自有属性
      console.log(eh.hasOwnProperty('name'))=>true
      console.log(eh.hasOwnProperty('color'))=>true

      for(var key in eh){
            console.log(key);
        if(eh.hasOwnProperty(key)){
        console.log(key)    //=>species  say name  color
        }   
      }

参考文档

Javascript面向对象编程(二):构造函数的继承
[JavaScript权威指南]

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

推荐阅读更多精彩内容

  • 普通创建对象和字面量创建对象不足之处:虽然 Object 构造函数或对象字面量都可以用来创建单个对象,但这些方式有...
    believedream阅读 7,089评论 2 18
  • 博客内容:什么是面向对象为什么要面向对象面向对象编程的特性和原则理解对象属性创建对象继承 什么是面向对象 面向对象...
    _Dot912阅读 5,283评论 3 12
  • 本章内容 理解对象属性 理解并创建对象 理解继承 面向对象语言有一个标志,那就是它们都有类的概念,而通过类可以创建...
    闷油瓶小张阅读 4,330评论 0 1
  • 9月8日是武汉软件工程技术学院新生报名日,19岁的大一新生童浩提前一天向学校提出了申请,要求在校外住宿,因为他需要...
    潇湘雨妃阅读 4,193评论 1 6
  • 你是缺少从容 你不是没机会 你是缺少勇气 你不是没变化 你是缺少毅力 能力再强,你不专注 也成就不了你的梦想 舞台...
    小兔姐姐阅读 1,937评论 0 1