以下两种情况有何不同?
案例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
只是想了解这个范围如何适用于这两种情况。
答案 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引擎所采取的基本步骤:
this
设置为新的干净对象。[[Prototype]]
属性设置为构造函数prototype
(在某些实现中,可通过__proto__
获取)。constructor
属性设置为对构造函数的引用(因此,您可以通过me.__proto__
访问原型,而不是非标准me.constructor.prototype
。 请注意,这是一个非常基本的解释。这里还没有包含许多其他内容,但这应该是你的要点。
答案 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