在以下两种情况下,这有什么区别?
情况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
只是想了解这个范围在这两种情况下是如何工作的。
在以下两种情况下,这有什么区别?
情况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
只是想了解这个范围在这两种情况下是如何工作的。
JavaScript 中的每个函数本身就是一个对象。因此从函数本身Person.name
检索name
属性,该属性从未设置过;因此undefined
.
您可以直接尝试我的设置:
Person.name = "John";
Person.name; // "John"
通过在构造函数中分配属性时
this.name = "Allen Kim";
您正在该实例上设置属性。然后,当您使用以下命令实例化对象时:
var me = new Person();
您的构造函数会将name
属性添加到me
,因为this
引用正在创建的对象。
new
以下是 JavaScript 引擎在使用关键字调用构造函数时采取的基本步骤:
this
设置为新的干净对象。[[Prototype]]
属性设置为构造函数的prototype
(在某些实现中,可以通过 获得__proto__
)。constructor
而不是非标准的)。me.__proto__
me.constructor.prototype
请注意,这是一个非常基本的解释。这里没有包括许多其他的东西,但这应该给你它的要点。
在第一种情况下,您正在寻找函数本身的静态属性。
第二种情况,您通过调用构造函数返回具有该属性的对象的实例。这不是范围的问题。
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