【问题标题】:Using JSON notation, how do I create a public method in javascript?使用 JSON 表示法,如何在 javascript 中创建公共方法?
【发布时间】:2011-05-28 22:50:22
【问题描述】:

在这个例子中:

var circle = {
  radius : 9,
  getArea : function()
  {
    return (this.radius * this.radius) * Math.PI;
  }
};

来自this page 的封装主题,getArea 是私有的,如何公开?

【问题讨论】:

  • 你确定吗?因为那是公开的。我可以做 circle.radius 和 circle.getArea()
  • 你为什么不在自己的萤火虫中尝试它,因为我这样做了,它确实对我有用:)

标签: javascript oop json


【解决方案1】:

那不是JSON notation,那是 JavaScript 对象字面量表示法。 (JSON 是对象文字表示法的子集。它不允许使用函数,需要双引号,并且不支持八进制或十六进制。)

getArea 不是私有的,任何东西都可以调用它。您引用的页面根本不正确。如果您想要 JavaScript 中真正私有方法的模式,here's a roundup 会介绍各种权衡(包括 Crockford 模型的内存成本,这是最常见的形式)。

【讨论】:

  • @Tom:大声笑,我只是在评论语法不太正确。它仍然不是私人的。
  • 那么this page的封装话题完全错了?
  • @Tom:诚然,我只是向下滚动到那个例子,但是是的,我读到它是错误的。它说 “在这两种情况下,这都将每个 getArea() 方法的范围限制为每个圆形对象。” 这根本不正确。 “范围”肯定是错误的。即使您尝试将“范围”理解为“上下文”(this 值),这是一个相当大的飞跃,它仍然是错误的; JavaScript 没有方法,只有函数:blog.niftysnippets.org/2008/03/mythical-methods.html
  • 博文+1 -- 我只是略读了一下,但它看起来像是对 Javascript 中伪私有数据设计模式的深入研究。
【解决方案2】:

作为 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 函数无法访问 radius 变量,因为像 circle 这样的对象没有自己的范围。如果你尝试:

var myObj = {test:this};

alert(myObj.this);

你会看到[object DOMWindow]

那么如何创建一个带有radius属性和getArea方法的对象Circle呢?有很多方法。一种方法是这样的:

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。

这也可以使用原型属性来实现:

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/>");

【讨论】:

    【解决方案3】:

    javascript 中没有私有方法或属性之类的东西。

    所有内容都是公开的,但通常的做法是将任何以 _ 开头的内容视为私有内容,但这是唯一的约定,并非由语言强制执行。

    要拥有私有方法和属性,您需要真正的类来定义它们,而 javascript 没有真正的类。

    【讨论】:

    • 您可以使用 javascript 创建私有方法和属性。它不像是在 java 或其他 OO 语言中,但它确实有效。看看:crockford.com/javascript/private.html
    • “在 javascript 中没有私有方法……” 没错,但因为 JavaScript 根本没有方法(只有函数)。完全可以创建 nothing else 可以看到的私有函数。不过也有成本。 “在 javascript 中没有私有...属性之类的东西。” 非常正确。一旦某个东西实际上是一个对象的属性,它对任何可以引用该对象的东西都是可见的。
    • @Zevan:您不能在 JavaScript 中创建私有 properties,而不是从字面意义上的对象属性。但是,是的,您当然可以拥有私人数据,正如您提供的 Crockford 链接所证明的那样。
    • +1 这是一个很好的观点,我想如果你真的深入到它的语义上你是对的。总是很高兴知道如何模仿 Crockford 示例中的这种行为。
    猜你喜欢
    • 2011-12-06
    • 2012-08-17
    • 1970-01-01
    • 2014-10-06
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    相关资源
    最近更新 更多