Используя нотацию JSON, как мне создать публичный метод в javascript? - PullRequest
1 голос
/ 21 декабря 2010

В этом примере:

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

с на этой странице Тема инкапсуляции, getArea является частной, как будет с ней публично?

Ответы [ 3 ]

7 голосов
/ 21 декабря 2010

Это не нотация JSON , это буквенная нотация объекта JavaScript.(JSON является подмножеством объектной литеральной нотации. Он не допускает функций, требует двойных кавычек и не поддерживает восьмеричные или шестнадцатеричные.)

getArea не является частным, это может вызывать что угодно.Страница, которую вы цитировали, просто неверна.Если вам нужны шаблоны для действительно приватных методов в JavaScript, приведем сводку с описанием различных компромиссов (включая стоимость памяти модели Крокфорда, которая является наиболее распространенной формой).

1 голос
/ 21 декабря 2010

Как Т.Дж. Краудер говорит ... это не JSON. Я думаю, возможно, проблема в том, что свойство 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]

Так как же создать объект Circle со свойством 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 вышеупомянутого .

Этого также можно достичь, используя свойство 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/>");
0 голосов
/ 21 декабря 2010

В javascript нет такого понятия, как закрытый метод или свойство.

Все общедоступно, но общепринятая практика - трактовать все, что начинается с _, как частное, но это всего лишь соглашение, которое не обеспечивается языком.

Чтобы иметь закрытые методы и свойства, вам нужны реальные классы для их определения, а у javascript нет реальных классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...