在此示例中:
var circle = {
radius : 9,
getArea : function()
{
return (this.radius * this.radius) * Math.PI;
}
};从this page的封装主题来看,getArea是私有的,它是如何公开的?
发布于 2010-12-22 00:47:26
这不是JSON notation,那是JavaScript对象文字表示法。(JSON是对象文字表示法的子集。它不允许使用函数,需要双引号,并且不支持八进制或十六进制。)
getArea不是私有的,任何人都可以调用它。你引用的页面是完全错误的。如果您希望在JavaScript中使用真正私有方法的模式,可以使用here's a roundup,它考虑了各种权衡(包括最常见的形式--克罗克福德模型的内存开销)。
发布于 2010-12-22 01:13:39
正如T.J.克劳德所说..。这不是JSON。我认为问题可能在于您的circle对象的getArea属性被设置为getArea函数返回的任何内容。这意味着circle.getArea()不能工作,因为circle.getArea是一个数字。这是错误的,但我认为它离你试图实现的目标更近了一步(我将在这之后展示更好的方法):
var circle = {
radius : 9,
getArea : function(){
return Math.PI * 9 * 9;
}
};
alert(circle.radius);
alert(circle.getArea());上面的重点是注意我在对象中定义getArea函数的方式。这可能很有用,但问题是get area函数不能访问半径变量,因为像circle这样的对象没有自己的作用域。如果你尝试:
var myObj = {test:this};
alert(myObj.this);你会看到[object DOMWindow]
那么如何创建一个具有radius属性和getArea方法的对象圆呢?有很多种方法。一种方式是这样的:
function Circle(r){
var c = this;
this.radius = r;
this.getArea = function(){
return Math.PI * c.radius * c.radius;
}
}
var circle = new Circle(10);
document.write(circle.getArea()+"<br/>");
circle.radius = 20;
document.write(circle.getArea()+"<br/>");
var otherCircle = new Circle(1);
document.write(otherCircle.getArea()+"<br/>");我已经创建了一个jsFiddle of the above。
这也可以使用prototype属性来实现:
function Circle(r){
this.radius = r;
}
Circle.prototype.getArea = function(){
return Math.PI * this.radius * this.radius;
}
var circle = new Circle(10);
document.write(circle.getArea()+"<br/>");
circle.radius = 20;
document.write(circle.getArea()+"<br/>");
var otherCircle = new Circle(1);
document.write(otherCircle.getArea()+"<br/>");发布于 2010-12-22 00:54:22
javascript中没有私有方法或属性这样的东西。
每件事都是公开的,但常见的做法是将任何以_开头的内容视为私有,但这只是约定,并不是由语言强制执行的。
要拥有私有的方法和属性,你需要真正的类来定义它们,而javascript没有真正的类。
https://stackoverflow.com/questions/4501689
复制相似问题