【发布时间】:2011-02-16 07:15:51
【问题描述】:
在以下代码中:
<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>
什么被警告?答案在这个问题的末尾。
我发现警报调用中的i 要么是指任何本地(如果有),要么是全局变量。即使没有定义局部变量和全局变量,它也不可能是实例变量或类变量。要引用实例变量i,我们需要this.i,而要引用类变量i,我们需要Circle.i。这对几乎所有面向对象的编程语言来说都是真的吗?有什么例外吗?有没有局部没有全局的情况下,先查找实例变量,再查找类变量作用域? (或者在这种情况下,那些称为范围?)
答案是:10 正在收到警报。
【问题讨论】:
-
wiki,因为它可能涉及不同的语言,可能会有不同的人提到的一些不同的案例
-
这显然是您的 JavaScript 中的错误。
-
这非常特定于 Javascript(或类似语言),与“大多数面向对象的语言”关系不大。
-
@deceze 在其他一些语言中会有什么不同?
-
在基于类(C/Java 风格)的面向对象语言中,不能在类定义之外定义实例方法(为“实际情况做好准备”... ;)),因此它们的范围是明确限于它们所属的类/对象。基于原型的面向对象语言的工作方式大不相同,因为可以将方法从对象外部的范围附加到对象(就像您正在做的那样)。
标签: javascript oop instance-variables class-variables