JavaScript OOP。 试图在JavaScript中学习OOP

以下是我正在尝试理解的一个简单的JavaScript OOP。 我想知道为什么getA()getC()返回undefined,但是当我在构造函数中更改variablesB并将其赋值给b时,同样的getB()返回2。

当我运行getD()它返回,我正在分配? this在这里工作如何?

 var a,b,c,d; var encap = function(a,B,c,d){ a = a; b = B; this.c = c; this.d = d; } encap.prototype.getA = function() { return a; // returns undefined }; encap.prototype.getB = function() { return b; // returns 2 }; encap.prototype.getC = function() { return c; // undefined }; encap.prototype.getD = function() { return this.d; }; encap.prototype.setA = function(A) { a = A; }; encap.prototype.setB = function(B) { b = B; }; var encapObj = new encap(1,2,4,6); console.log(encapObj.getA()); // undefined console.log(encapObj.getB()); // 2 console.log(encapObj.getC()); // undefined console.log(encapObj.getD()); // 6 

在这里你去了,我评论了什么variables被分配到哪里的每个分配。

这应该有助于解释的事情。

 // Create four global variables. var a,b,c,d; var encap = function(a,B,c,d){ // Assign local argument a, to local argument a. Does nothing a = a; // Assign local argument "B" to global variable "b" b = B; // assign local argument 'c' to property 'c' this.c = c; // assign local argument 'd' to property 'd' this.d = d; } encap.prototype.getA = function() { // Returns global variable a return a; // returns undefined }; encap.prototype.getB = function() { // Return global variable B, which was assigned in the constructor return b; // returns 2 }; encap.prototype.getC = function() { // Return global variable 'c' return c; // undefined }; encap.prototype.getD = function() { // return object property 'd', which was assigned. return this.d; }; encap.prototype.setA = function(A) { // assign global variable 'a' from argument 'A' a = A; }; encap.prototype.setB = function(B) { // assign global variable 'b' from argument 'B' b = B; }; var encapObj = new encap(1,2,4,6); 
 a = a; 

这从局部variablesa分配给局部variablesa ,实际上(无效?)什么也不做。 全局variables仍然被设置为undefined默认值,这就是为什么你不能从getA() undefined的原因。

getC() ,您返回全局variablesc的值,但只分配给实例的属性cthis.cthis不是在JavaScript中隐含的。

好的,这就是交易。 你有四个全局variables:

 var a, b, c, d; 

你也有四个variables是构造函数的局部variables

 var encap = function(a,B,c,d); 

那么你也有两个“实例”variables – 创build时附加到新对象的variables。

 this.c = c; this.d = d; 

在构造函数中,设置a = a – 这实际上只是将本地variables(参数) a为自身。 您正在从=两边访问构造函数中的局部variables。 在你的访问器getA ,你返回全局variablesa – 这是未定义的。

同样在构造函数中,您将全局variablesb的值设置为等于局部variablesB的值 – 请记住,它们是不同的,因为JavaScript区分大小写。 所以,你的全局variablesb现在的值是2 。 既然你再一次在你的访问器getB返回全局variables,你会得到值2

在你的访问器getC ,你仍然返回从未设置的全局variablesc 。 因此undefined 。 然而,这次你在构造函数中设置了this.c ,所以如果你要在你的访问器中return this.c ,你应该得到正确的值。

总之,你应该在所有的variables赋值和返回中使用它。 所以,你的构造函数应该如下所示:

 var encap = function(a,B,c,d){ this.a = a; this.b = B; this.c = c; this.d = d; } 

你的访问者应该是这样的:

 encap.prototype.getD = function() { return this.d; }; 

从那里,我认为你的制作者应该看起来很明显。 祝你好运,在JavaScript中的OOP的探索。 这是我最喜欢的语言,我喜欢它的面向对象,尽pipe有人说这个。 如果你有麻烦,StackOverflow JS聊天室通常是有帮助的,所以在一段时间之后。

有一点你应该知道:Javascript是完全面向对象的语言,在JavaScript中没有OOP“方式”。 所有原始types(undefined,number,string,boolean,null)都是一个对象。