我可以在对象中创建方法吗?

时间:2011-03-28 08:09:04

标签: javascript object methods

之前我看过这段代码,但我不知道其含义是什么:

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 个答案:

答案 0 :(得分:4)

该代码正在做三件事:

  1. 使用对象文字语法创建对象实例
  2. 使用匿名函数表达式创建函数并将它们绑定到对象的属性。 (函数是JavaScript中的第一类对象,因此您可以保留对它们的引用,传递引用等)。
  3. 具体来说,它覆盖了所有JavaScript对象从Object原型继承的两个标准函数。
  4. 让我们分解一下。

    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”)的属性很方便,如果它们是语法错误的话没有引号。

    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"
    

    (我不喜欢匿名函数,I prefer my functions to have names,但这是另一个话题。)

    3)最后:正如maerics指出的那样,该代码中使用的特定函数是toStringtoLocaleString,它们都是JavaScript对象的标准函数。这意味着那些覆盖标准版本,因此每当调用标准函数时都会返回给定的值。

答案 1 :(得分:1)

specification of the language为所有JavaScript对象实现了toString()toLocaleString()方法。因此,数组(例如存储在“people”变量中的数组)似乎分别通过返回每个元素的字符串或“locale string”值来实现这些方法(至少在我们正在测试的Web浏览器中)。 / p>

也就是说,必须使用以下内容实现Array类toStringtoLocaleString方法:

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(",");
}