hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()的用法

javascript中有原型這麼一個概念,任何一個構造函數都有它對應的原型(prototype),咱們能夠給這個原型賦予一些咱們想要的屬性,像下面這樣:javascript

function Gadget(name, color){
    this.name = name;
    this.color = color;
    this.whatAreYou = function(){
        return 'I am a ' + this.color + ' ' + this.name;
    }
}

Gadget.prototype.price = 100;
Gadget.prototype.rating = 3;
Gadget.prototype.getInfo = function(){
    return 'Rating: ' + this.rating + ', price: ' + this.price;
  };


var newtoy = new Gadget('webcam', 'black');

這裏我定義了一個Gadget類的實例--newtoy對象。 在這個對象中,咱們能夠訪問對象內部及其原型對象中的屬性或者方法。  若是想要得到某個對象全部屬性的列表,咱們能夠使用for-in循環:java

for i in newtoy{
    console.log(i + ' = ' + newtoy[i]);
}

咱們能夠獲得下面的結果:web

name = webcam
color = black

whatAreYou = function (){
        return 'I am a ' + this.color + ' ' + this.name;
    }

price = 100
rating = 3

getInfo = function (){
    return 'Rating: ' + this.rating + ', price: ' + this.price;
  }

這時候,若是咱們想要把原型中的屬性過濾掉,就能夠首先使用hasOwnProperty()來判斷該屬性是否是屬於對象內部的:函數

for(var i in newtoy){
    if(newtoy.hasOwnProperty(i))
        console.log(i + ' = ' + newtoy[i]);
}

另外須要注意的幾點是:測試

  • 只有那些可枚舉的屬性纔會被顯示出來(通常內建屬性都是不可枚舉的)
  • 原型中的各個原型屬性也會被顯示出來,固然前提是它們是可枚舉的
  • propertyIsEnumerable()用於測試該屬性是否可枚舉,對於因此的原型屬性,propertyIsEnumerable()都會返回false,包括那些在for-in循環中可枚舉的屬性。但若是propertyIsEnumerable()的調用是來自原型鏈上的某個對象,那麼該對象中的屬性是可枚舉的。例如:
    newtoy.constructor.prototype.propertyIsNumerable('price'); 
    //返回: ture

每一個對象中都會有一個isPrototypeOf()方法,這個方法會告訴咱們當前對象是不是另一個對象的原型。this

var monkey = {
    hair: true,
    feeds: 'bananas'
};

function Human(name){
    this.name = name;
}
Human.prototype = monkey;

var tom = new Human("Tom");
monkey.isPrototypeOf(tom);

//返回: true spa

相關文章
相關標籤/搜索