【问题标题】:Can I create a method in an object?我可以在对象中创建方法吗?
【发布时间】:2011-07-24 07:04:44
【问题描述】:

之前看到过这段代码,但不知道什么意思:

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?? 或...?? 的方法创建对象?

【问题讨论】:

标签: javascript object methods


【解决方案1】:

这段代码做了三件事:

  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”)名称的属性很方便,如果它们将是语法错误不在引号中。

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 对象的标准函数。这意味着它们将覆盖标准版本,因此在调用标准函数时返回给定值。

【讨论】:

  • 当您需要一个 +2 按钮时,永远不会有一个 ... ;-)
【解决方案2】:

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

也就是说,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(",");
}

【讨论】:

  • 那个原型方法在那里做什么?我一直不明白那个。
  • 那么,函数中定义的toLocaleString和toString属性是干什么用的??
  • @Michael:prototype 是 JavaScript 中继承的基础。它是所有函数的属性,如果函数通过new 关键字用作构造函数,则使用它。函数的prototype 属性所引用的对象被指定为函数创建的对象的prototype,这实际上意味着该对象可以访问该对象的所有属性(包括 - - 重要的是 - 引用函数的属性)。
  • @dramasea:没有toString在函数中定义。你这是什么意思?
猜你喜欢
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多