在这里刷新我的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爆炸了对象视图:

javascript - 根据如何声明方法的不同可访问性-LMLPHP

最佳答案

每次使用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是所谓的静态方法。

09-17 09:56