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

Javascript function properties - Stack Overflow

programmeradmin4浏览0评论

Why is it that I can do the following in javascript:

function a() {};
a.foo = 30;

Specifically, why can I set a property on the function a? After all, I cannot do this:

var a = 20;
a.foo = 30;

Why is it that I can do the following in javascript:

function a() {};
a.foo = 30;

Specifically, why can I set a property on the function a? After all, I cannot do this:

var a = 20;
a.foo = 30;
Share Improve this question edited Sep 8, 2010 at 23:32 Bain Markev asked Sep 8, 2010 at 23:22 Bain MarkevBain Markev 2,9955 gold badges30 silver badges28 bronze badges
Add a ment  | 

4 Answers 4

Reset to default 8

You really can't do this because it's a syntax error

function a = function() {};

I suppose you simply want to say:

function a() {}

Anyway. The reason that you cannot get a property out of a number, is that it is not a real Object.

a = 20;
a.foo = 30;   // this works
alert(a.foo); // this alerts nothing

Believe it or not, the same goes for strings:

a = "ohai";
a.foo = 30;   // this works
alert(a.foo); // this alerts nothing

However if it's String object, then it works as expected:

a = new String("ohai");
a.foo = 30;   // this works
alert(a.foo); // this alerts 30

Or if it's an Number object. You get the point.

String and number literals are not objects in Javascript. That's the reason.

In JavaScript the dot (.) operator expects it's left value to be an object. And in JavaScript, functions are objects.

Basically, in JavaScript, there are four main datatypes:

  1. Number
  2. String
  3. Boolean
  4. Object

Objects enpasses functions, arrays, date objects, and (for lack of a better word) regular objects. The function object is unique in that it contains executable code, and can be invoked.

Numbers are primitives, and thus you cannot access/assign properties to/from them.

In Javascript, a function is an object, so you can set properties on it:

function a() {};
a.foo = 30;
a.foo; // evaluates to 30

A number literal however creates a primitive value (which has no properties) and not an object.

a = 20;       // Create primitive value using number literal

When you set a property on a primitive value, in fact you create a wrapper object around the primitive value and set the property on the wrapper object, not the primitive value.

a.foo = 30;               // wrapper object created and directly thrown away
(new Number(a)).foo = 30; // --> equivalent

When you read the property, again you create a wrapper object, whihch hasn't the property defined.

a.foo;                    // wrapper object created, has no foo property
(new Number(a)).foo;      // --> equivalent, evaluates to undefined

In javascript functions are objects. Or they inherit from objects, or something.

try doing

a = function(){};
alert(typeof a.prototype);
发布评论

评论列表(0)

  1. 暂无评论