2017-12-16 15 views
0

私は最近、ガイドを見て、hasOwnPropertyの概念をよりよく理解したかったのです。 MozillaによればなぜオブジェクトでhasOwnProperty( 'toString')が機能しないのですか?

「hasOwnPropertyを()メソッドは、オブジェクトが(継承されない)自身のプロパティとして指定された性質を持っているかどうかを示すブール値を返します。」

私はオブジェクトに

var test = {yes:function(){}} 

を作成し、

test.hasOwnProperty('toString') 

を行なったし、それはfalseが返さ。なぜなら、toStringはテストの中で正しく作成していないメソッドなのですから?

しかし、私は配列にhasOwnPropertyをを記録し、長さを渡すので、

var arr1 = new Array 
arr.hasOwnProperty('length') //appears to return true 

場合、それはtrueを返しますが、私は長さを宣言したことはありません。

私はhasOwnPropertyをのみ継承されないプロパティに働くと思った -

配列オブジェクトは、lengthプロパティを継承するときに、なぜ、アレイ上にhasownprop(「長さ」)を使用してtrueを返すん、

しかし

var test = {yes:function(){}} 
test.hasOwnProperty('toString') //false 

なぜこれがfalseを返しますか? toStringはオブジェクトのプロトタイプのメソッドで、Google Chrome Consoleにログオンすると表示されます

+0

アレイ上の 'length'プロパティが継承されていません。すべての配列には独自の長さがあります。 – melpomene

+0

'toString'は(オブジェクトのプロトタイプから)継承されています。すべての(バニラ)オブジェクトは同じ 'toString'メソッドを持ちます。 – melpomene

+0

@melpomene実際、 '.length'は' Array.prototype'の特別なgetter/setterプロパティであると考えられます。もちろん、あなたは正しい、そうではありません。 – Bergi

答えて

1

その理由は、toStringはテストの右側に作成していないメソッドなのですか?

ええ、オブジェクトリテラルから作成されたオブジェクトは、リテラルで宣言された独自のプロパティしか持っていません。

しかし、プロパティを明示的に宣言していないということは、そのプロパティが継承されているか、存在していないという意味ではありません。配列には、new Array呼び出しで配列コンストラクタによって基本的に作成される独自の.lengthプロパティがあります。

は、次のことを想像してみて:

function Test() { 
    this.prop = "some value"; 
} 
var x = new Test; 
console.log(x.hasOwnProperty("prop")) // what do you expect? 
関連する問題