0

在以下两种情况下,这有什么区别?

情况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

只是想了解这个范围在这两种情况下是如何工作的。

4

3 回答 3

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. 返回所述对象。

请注意,这是一个非常基本的解释。这里没有包括许多其他的东西,但这应该给你它的要点。

于 2013-01-07T19:36:10.757 回答
1

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

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

于 2013-01-07T19:36:28.003 回答
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
于 2013-01-07T19:36:45.310 回答