在这里刷新我的Javascript知识,因此我知道这是该语言的基础。在我的示例中,我可以看到发生了什么,只是无法说出原因。我还添加了Chrome Console分解对象视图。
题:
在以下情况下,关于可访问性,我声明MyMethod1和MyMethod2的方式有什么区别?
a)Example.MyExample.Person对象和
b)对于p,是Example.MyExample.Person的实例?
码:
Example = {}
Example.MyExample = {}
Example.MyExample.Person = function(name, age, gender)
{
this.name = name;
this.age = age;
this.gender = gender;
this.MyMethod1 = function(){alert("My Method 1");}
};
Example.MyExample.Person.MyMethod2 = function(){alert("My Method 2");}
var p = new Example.MyExample.Person("tom", 78, "m");
p.MyMethod1(); // My Method 1
p.MyMethod2(); // p.MyMethod2 is not a function
Example.MyExample.Person.MyMethod1; // Example.MyExample.Person.MyMethod1 is not a function
Example.MyExample.Person.MyMethod2(); // My Method 2
Chrome爆炸了对象视图:
最佳答案
每次使用new
调用构造函数时,它都会返回一个新对象。它只是帮助设置新对象的属性值。新对象不等于构造函数:
new SomeClass() !== SomeClass;
现在,您已将
MyMethod2
分配为构造函数本身的属性。因此,要访问MyMethod2
,您必须使用构造函数:Example.MyExample.Person.MyMethod2();
但是,
MyMethod1
被分配(重新定义)给使用Person
调用new
返回的每个对象。因此,您必须获得该类的实例才能访问MyMethod1
。更:var p1 = new Example.MyExample.Person();
var p2 = new Example.MyExample.Person();
p1.MyMethod1 !== p2.MyMethod1; // because each time the constructor function get called MyMethod1 get redifined (they can be equal if they are attached to the prototype instead)
MyMethod2
是所谓的静态方法。