• home > webfront > ECMAS > javascript >

    判断JS对象是否拥有某种属性的方法:hasOwnProperty与in的区别

    Author:[email protected] Date:

    判断JS对象是否拥有某种属性的两种方式,稍微有区别1,in 运算符复制代码 代码如下:var obj = {name:& 39;jack& 39;};alert(& 39;name

    判断JS对象是否拥有某种属性的两种方式,稍微有区别

    1,in 运算符

    复制代码 代码如下:

    var obj = {name:'jack'}; 

    alert('name' in obj); // --> true 

    alert('toString' in obj); // --> true 

    可看到无论是name,还是原形链上的toString,都能检测到返回true。

    2,hasOwnProperty 方法 

    复制代码 代码如下:

    var obj = {name:'jack'}; 

    obj.hasOwnProperty('name'); // --> true 

    obj.hasOwnProperty('toString'); // --> false 

    原型链上继承过来的属性无法通过hasOwnProperty检测到,返回false。

    需注意的是,虽然in能检测到原型链的属性,但for in通常却不行

    当然重写原型后for in在IE9/Firefox/Safari/Chrome/Opera下是可见的。

    js判断是否拥有某个属性

    用“In”来查找是深度查找 查找原型链里  是否有这……属性。  而平时小项目常用“hasOwnProperty”来查找(查找自身小范围内是否有此属性,可能更快捷高效。而“in”有特殊需求时使用。)

    附以下写法对比。

    var Rect = function(){
      this.width = 900;
      this.height = 600;
      this.name = "wang";
      var testPorp = "test";
    };
    var RectBase = function(){
      this.width = 500;
      this.height = 400;
      this.x = 1;
      this.y = 2;
    };
    Rect.prototype = new RectBase();
    var rect = new Rect();
    console.log("x" in rect);
    console.log(rect.hasOwnProperty("x"));





    //以下转载

    理顺 JavaScript (15) - 类的继承手段: prototype


       prototype(原型) 是 JavaScript 中类的继承手段;

       一个类也不过是一组属性和方法的集合, 所谓继承就是继承属性或方法;

       属性是个值, 方法是个函数, JavaScript 喜欢把它们都叫成属性, 我们喜欢把它们叫做成员;

       JavaScript 默认让每个函数都拥有一个 prototype 对象, 它可以指向一个对象或函数(函数也是对象, 一回事);

       绕来绕去, 最终是四通八达...



       类成员与对象成员


    function Rect(w, h) {
      Rect.name = "My Rect"; //静态成员属于类, 不会被对象继承; 须冠类名调用  this.width = w;        //this 是指实例化以后的对象或调用该函数的对象  this.height = h;
      xyz = 123;            //这只能当个内部变量来使用}var r = new Rect();//判断指定的成员名是否属于对象alert("width" in r);  //truealert("height" in r); //truealert("name" in r);   //false//遍历对象成员for (x in r) {
      alert(x);           //width / height}//遍历类成员for (x in Rect) {
      alert(x);           //name}


       继承


    function Point(x, y) {
      this.x = x;
      this.y = y;
    };function Rect(w, h) {
      Rect.name = "My Rect";
      this.width = w;
      this.height = h;
    }
    Rect.prototype = new Point(); //让 Rect 再从 Point 类继承var r = new Rect();//继承以后就可以这样使用r.x = 1;
    r.y = 2;
    r.width = 3;
    r.heigth = 4;//遍历对象成员for (x in r) {
      alert(x); //y / x / width / height}//遍历类成员for (x in Rect) {
      alert(x); //name}//建立方法 constructor 属于 prototype, 既然 Rect 是继承与 Point, 那么:alert(r.constructor); /* 将显示:
    function Point(x, y) {
      this.x = x;
      this.y = y;
    };
    */


       hasOwnProperty、propertyIsEnumerable、isPrototypeOf


    function Point(x, y) {
      this.x = x;
      this.y = y;
    };function Rect(w, h) {
      Rect.name = "My Rect";
      this.width = w;
      this.height = h;
    }
    Rect.prototype = new Point();var r = new Rect();/* 可用 hasOwnProperty 方法判断指定成员是否是对象的固有成员(而非继承来的) */alert(r.hasOwnProperty('x'));      //falsealert(r.hasOwnProperty('y'));      //falsealert(r.hasOwnProperty('width'));  //truealert(r.hasOwnProperty('height')); //true/* 但不能用 hasOwnProperty 判断成员是否是继承来的, 譬如 */alert(r.hasOwnProperty('ABCDEFG')); //false/* propertyIsEnumerable */alert(r.propertyIsEnumerable('x'));      //falsealert(r.propertyIsEnumerable('y'));      //falsealert(r.propertyIsEnumerable('width'));  //truealert(r.propertyIsEnumerable('height')); //true/* isPrototypeOf: 是不是参数(参数是个对象)的原型对象 */alert(Point.prototype.isPrototypeOf(r));    //truealert(Rect.prototype.isPrototypeOf(r));     //truealert(r.isPrototypeOf(r));                  //truevar obj = {};
    alert(Object.prototype.isPrototypeOf(obj)); //truevar str = new String();
    alert(String.prototype.isPrototypeOf(str)); //truealert(Object.prototype.isPrototypeOf(str)); //true

    转载本站文章《判断JS对象是否拥有某种属性的方法:hasOwnProperty与in的区别》,
    请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/js/2016_0311_7695.html