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
的值,但只分配给实例的属性c
: this.c
。 this
不是在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)都是一个对象。