javascript函数对象和这个

时间:2013-01-07 19:34:20

标签: javascript

以下两种情况有何不同?

案例1

var Person = function() { this.name="Allen Kim" }
Person.name; //undefined

案例2

var Person = function() { this.name="Allen Kim" }
var me = new Person();
me.name // Allen Kim

只是想了解这个范围如何适用于这两种情况。

3 个答案:

答案 0 :(得分:6)

JavaScript中的每个函数本身都是一个对象。所以Person.name从函数本身检索name属性,该属性从未设置过;因此undefined

您可以直接尝试此设置:

Person.name = "John";
Person.name; // "John"

通过

从构造函数中指定属性时
this.name = "Allen Kim";

您正在该实例上设置属性。然后,然后使用:

实例化对象
var me = new Person();

您的构造函数会将name属性添加到me,因为this会引用正在创建的对象。


以下是使用new关键字调用构造函数时JavaScript引擎所采取的基本步骤:

  1. 调用构造函数,并将this设置为新的干净对象。
  2. 将新对象的内部[[Prototype]]属性设置为构造函数prototype(在某些实现中,可通过__proto__获取)。
  3. 将新对象的constructor属性设置为对构造函数的引用(因此,您可以通过me.__proto__访问原型,而不是非标准me.constructor.prototype
  4. 返回所述对象。
  5. 请注意,这是一个非常基本的解释。这里还没有包含许多其他内容,但这应该是你的要点。

答案 1 :(得分:1)

在第一种情况下,您正在寻找函数本身的静态属性。

第二种情况是通过调用构造函数返回具有该属性的对象的实例。这不是一个范围问题。

答案 2 :(得分:1)

var Person = function() { this.name="Allen Kim" }
Person.name; //undefined due to the fact that there is no Person object.

var Person = function() { this.name="Allen Kim" }
var me = new Person();
me.name // Allen Kim --> Person `me`'s name