Могу ли я создать метод в объекте? - PullRequest
2 голосов
/ 28 марта 2011

Я видел этот код раньше, но я не знаю, что означает:

var person1 = {
    toLocaleString : function(){
      return "Nikolaos";
     },
    toString : function(){
      return "Nicholas";
    }
}

var person2 = {
   toLocaleString : function(){
      return "bum";
   },
   toString : function(){
       return "Greg";
   } 

}

var people = [person1, person2];
alert(people.toString());
alert(people.toLocaleString());

создает ли функция объект с методами toLocaleString и toString ?? или ... ??

Ответы [ 2 ]

4 голосов
/ 28 марта 2011

Этот код выполняет три вещи:

  1. Использование литерального синтаксиса объекта для создания экземпляров объекта
  2. Использование выражений анонимной функции длясоздавать функции и связывать их со свойствами объектов.(Функции являются первоклассными объектами в JavaScript, поэтому вы можете хранить ссылки на них, передавать ссылки и т. Д.)
  3. В частности, это переопределяет две стандартные функции, которые все объекты JavaScript наследуют от прототипа Object.

Давайте разберем его немного.

1) Обозначение литерала объекта:

var obj = {propName: propValue};

{ и } в этом случае обозначают литерал объекта .Внутри литерала объекта вы можете написать propName: propValue, чтобы присвоить propValue свойству с именем propName для объекта.Это так же, как:

var obj = {};             // Get an empty object
obj.propName = propValue; // Add a property to it

Вы можете сделать несколько свойств, разделенных запятыми.Так, например:

var obj = {
    author: "Douglas Adams",
    title:  "The Hitchhiker's Guide to the Galaxy",
    answer: 42
};

Это создает объект с тремя свойствами, два со строковыми значениями и одно с числовым значением.

Обратите внимание, что правая часть обрабатывается так же, какприсваивание и т. д. может быть любым, что может появиться в правой части оператора присваивания:

var x = "bar";
var obj = {
    three: 1 + 2,
    fubar: "foo " + x
};

Имена свойств можно заключать в кавычки, если вам нравится:

var x = "bar";
var obj = {
    "three": 1 + 2,
    "fubar": "foo " + x
};

... который удобен для указания свойств, которые имеют имена зарезервированных токенов (например, "if" или "return") или ранее зарезервированных токенов (например, "class"), где будет синтаксическая ошибка, если они не былиt в кавычках.

2) Теперь давайте посмотрим на выражения функций:

var f = function() { /* your code here */ };

Это выражение функции.Он создает новую функцию и присваивает ссылку на нее переменной f.Вы можете вызвать его, позвонив по номеру f().

var f = function(name) {
    alert("Hi " + name);
};
f("Fred"); // alerts "Hi Fred"

1 + 2) Итак, соединяя его с буквенной нотацией объекта:

var obj = {
    foo: function(name) {
        alert("Hi " + name);
    }
};
obj.foo("Fred"); // alerts "Hi Fred"

(мне не нравятся анонимные функции, Я предпочитаю, чтобы у моих функций были имена , но это уже другая тема.)

3) И наконец: как указали maerics, конкретные функции, которые используются в этом коде, являются toStringи toLocaleString, оба из которых являются стандартными функциями объектов JavaScript.Это означает, что они будут переопределять стандартную версию и возвращать заданные значения всякий раз, когда будет вызвана стандартная функция.

1 голос
/ 28 марта 2011

Методы toString() и toLocaleString() реализованы для всех объектов JavaScript с помощью спецификации языка . Таким образом, массивы (например, хранящиеся в переменной "people"), похоже, реализуют эти методы, возвращая соответственно строку каждого элемента или строку "locale string" (по крайней мере, в веб-браузерах, которые мы тестируем).

То есть методы класса Array toString и toLocaleString должны быть реализованы примерно так:

Array.prototype.toString = function() {
  var a = [];
  for (var i=0; i<this.length; i++) {
    a[i] = this[i].toString(); // Note "toString".
  }
  return a.join(",");
}

Array.prototype.toLocaleString = function() {
  var a = [];
  for (var i=0; i<this.length; i++) {
    a[i] = this[i].toLocaleString(); // Note "toLocaleString".
  }
  return a.join(",");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...