Javascript 在大多数OOP语言中,是否;我";在实例方法中,首先引用局部变量,然后引用全局变量,但决不引用实例变量或类变量?
在以下代码中:Javascript 在大多数OOP语言中,是否;我";在实例方法中,首先引用局部变量,然后引用全局变量,但决不引用实例变量或类变量?,javascript,oop,instance-variables,class-variables,Javascript,Oop,Instance Variables,Class Variables,在以下代码中: <script type="text/javascript"> var i = 10; function Circle(radius) { this.r = radius; this.i = radius; } Circle.i = 123; Circle.prototype.area = function() { alert
<script type="text/javascript">
var i = 10;
function Circle(radius) {
this.r = radius;
this.i = radius;
}
Circle.i = 123;
Circle.prototype.area = function() { alert(i); }
var c = new Circle(1);
var a = c.area();
</script>
var i=10;
功能圆(半径){
r=半径;
i=半径;
}
圆圈i=123;
Circle.prototype.area=函数(){alert(i);}
var c=新的圆圈(1);
var a=c.面积();
警报是什么?答案在这个问题的末尾
我发现警报调用中的I
要么引用任何局部变量(如果有的话),要么引用全局变量。即使没有定义局部变量和全局变量,也无法将其作为实例变量或类变量。要引用实例变量i
,我们需要this.i
,而要引用类变量i
,我们需要Circle.i
。几乎所有面向对象编程语言都是这样吗?有例外吗?是否存在这样的情况:当没有局部变量和全局变量时,它将查找实例变量,然后查找类变量范围?(或者在这种情况下,这些被称为范围?)
答案是:10正在被警告。您看到的是一个关闭 如果您想要这个.i或圆.i,您必须明确地引用它们
就像在Python(self.x和cls.x)中一样,Javascript对于实例或类/原型属性没有语法糖。您看到的是一个闭包 如果您想要这个.i或圆.i,您必须明确地引用它们
就像在Python(self.x和cls.x)中一样,Javascript没有实例或类/原型属性的语法糖。在通用面向对象编程语言中,实例变量(如名称所示)只能通过类的实例访问(可通过类名访问的静态变量除外)。因此,当您想要引用实例变量时,您需要拥有类的对象(实例)。在通用面向对象编程语言中,实例变量(如名称所示)只能通过类的实例访问(可通过类名访问的静态变量除外)。因此,当您想要引用实例变量时,您需要拥有类的对象(实例)。要引用实例变量,您必须使用
this.i
Circle.i
引用Circle
构造函数上的静态属性——它对Circle
的实例没有影响要引用实例变量,必须使用this.i
Circle.i
引用Circle
构造函数上的静态属性——它不会影响Circle
的实例
大多数语言都允许您访问实例变量,而无需使用类似于this.i
的东西来指定它是实例变量
真正面向对象的语言,如Java、C#和VB(7+),甚至没有任何全局变量
Javascript并不是一种面向对象的语言,它是一种过程语言,对面向对象的支持有限。由于它没有类,因此没有任何类作用域,因此需要使用this
关键字指定对象作用域。不,这不是真的
大多数语言都允许您访问实例变量,而无需使用类似于this.i
的东西来指定它是实例变量
真正面向对象的语言,如Java、C#和VB(7+),甚至没有任何全局变量
Javascript并不是一种面向对象的语言,它是一种过程语言,对面向对象的支持有限。由于它没有类,因此没有任何类作用域,因此需要使用this
关键字指定对象作用域。
var i = 10;
function Circle(radius) {
var i = radius || 0;
this.r = i;
this.i = radius;
this.toString = function(){ return i; };
}
var nwCircle = new Circle(45);
alert(nwCircle.r); //=>45;
alert(nwCircle); //=>45 (toString found local i);
alert(i); //=>10
现在,在循环构造函数中,您创建了(本地,属于对象本身)变量i
的闭包。全局定义的i
不受影响。因此,在javascript中,它取决于定义变量的位置。至少在javascript中,对i
执行自下而上的搜索(从本地范围到全局范围),并使用找到的第一个搜索。因此,如果Circle
构造函数不包含名为i
的变量,则将使用全局i
。请注意:
var i = 10;
function Circle(radius) {
var i = radius || 0;
this.r = i;
this.i = radius;
this.toString = function(){ return i; };
}
var nwCircle = new Circle(45);
alert(nwCircle.r); //=>45;
alert(nwCircle); //=>45 (toString found local i);
alert(i); //=>10
现在,在循环构造函数中,您创建了(本地,属于对象本身)变量
i
的闭包。全局定义的i
不受影响。因此,在javascript中,它取决于定义变量的位置。至少在javascript中,对i
执行自下而上的搜索(从本地范围到全局范围),并使用找到的第一个搜索。因此,如果Circle
构造函数不包含名为i
的变量,则将使用全局i
。wiki,因为它可能涉及不同的语言,并且可能会有不同的人提到一些不同的情况。这显然是JavaScript中的一个错误。这对于JavaScript非常具体(或类似语言),与“大多数面向对象语言”没有什么关系。@deceze在其他一些语言中有什么区别?在基于类(C/Java风格)的语言中,面向对象的实例方法不能在类定义之外定义(为“良好的实际情况”做好准备…)因此,它们的范围显然仅限于它们所属的类/对象。基于原型的面向对象语言的工作方式大不相同,因为方法可以从对象之外的范围附加到对象(正如您所做的那样),因为它可能涉及不同的语言,不同的人可能会提到一些不同的情况,这显然是JavaScript中的一个错误