最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Understanding instanceof with JavaScript - Stack Overflow

programmeradmin1浏览0评论

I have a basic understanding of instanceof in JavaScript, testing if the left hand side object "is of" the right hand side object type. The following 2 examples help me understand that...

var demo1 = function() {};
demo1.prototype = {
foo: "hello"
};

var demo2 = function() {
var pub = {
    bar:"world"
};
return this.pub;
};

var obj1 = new demo1();
var obj2 = new demo2();

console.log(obj1 instanceof demo1);  //returns true
console.log(obj2 instanceof demo2);  //returns true

But on this 3rd example, I get false and I don't understand why....

var o = {}; // new Object;
o.toString(); // [object Object]
console.log(o instanceof toString); //returns false

Thanks for any help in understanding whats going on. Also...is is possible to make the 3rd example true?

Thanks again

I have a basic understanding of instanceof in JavaScript, testing if the left hand side object "is of" the right hand side object type. The following 2 examples help me understand that...

var demo1 = function() {};
demo1.prototype = {
foo: "hello"
};

var demo2 = function() {
var pub = {
    bar:"world"
};
return this.pub;
};

var obj1 = new demo1();
var obj2 = new demo2();

console.log(obj1 instanceof demo1);  //returns true
console.log(obj2 instanceof demo2);  //returns true

But on this 3rd example, I get false and I don't understand why....

var o = {}; // new Object;
o.toString(); // [object Object]
console.log(o instanceof toString); //returns false

Thanks for any help in understanding whats going on. Also...is is possible to make the 3rd example true?

Thanks again

Share Improve this question asked Oct 15, 2012 at 14:03 klewisklewis 8,43816 gold badges69 silver badges112 bronze badges 4
  • Your demo2 function is screwed up. There is no this.pub, so it will return undefined, and when called with the new operator this will result in an empty object (beeing an instanceof demo2 at least) – Bergi Commented Oct 15, 2012 at 14:08
  • It returns true for me, I'm using an example based off of T.J. Crawford's blog here - blog.niftysnippets/2010/03/anonymouses-anonymous.html – klewis Commented Oct 15, 2012 at 14:12
  • 1 Yes, obj2 instanceof demo2 is true for me, too. Still, your constructor is useless and could be replaced by an empty function. I can't see how yours came from any example in that very good article. – Bergi Commented Oct 15, 2012 at 14:18
  • Bergi I didn't post example 2 as a best practice for patterns, I know that. It's based on a response from a blog ment on that article. That's all. I plan on using standard patterns to achieve my goals. Thanks for the heavy critique on staying away from the style mentioned above. And yes its a great article. – klewis Commented Oct 15, 2012 at 14:23
Add a ment  | 

3 Answers 3

Reset to default 4

toString does not cause a type change of o. It just returns a string representation of the object, without altering it. So, o is still a simple object and no instanceof String.

var o = {}; // new Object object
var ostring = o.toString(); // "[object Object]"
typeof o; // object
typeof ostring; // string - this is a primitive value, not an object; so that
ostring instanceof String; // is false
var stringobj = new String(ostring); // new String object
typeof stringobj; // object
stringobj instanceof String; // true!
o instanceof Object; // also true!

See also MDN reference for the String constructor.

o is an object; toString is a function. They are different types in JavaScript.

alert(typeof(o));  //"object"
alert(typeof(toString)); //"function"

JavaScript makes a distinction between objects and functions. Therefore, that's why you get false returned in your example.

With an object literal like

var o = {}; // new Object;

you create an object whose prototype is Object. Testing with instanceof will not yield any useful information. The only parison that will yield true is

o instanceof Object
发布评论

评论列表(0)

  1. 暂无评论