【问题标题】:Question about Javascript properties and instances关于 Javascript 属性和实例的问题
【发布时间】:2011-04-11 18:07:09
【问题描述】:

我自己不明白为什么示例中的foo.barundefined,你能解释一下吗?

var foo = "foo";

foo.bar = "baz";
console.log(foo.bar); // undefined

Q2:如何将属性和方法的引用添加到String 实例foo

非常感谢您的帮助,谢谢。

-- 编辑--

注意:问题是关于通用字符串instance,而不是String global object。因此,不能像有人建议的那样使用“经典”原型,因为这样每个 String 实例都会有一个名为 bar 的属性,而我只想增加某些 instances

【问题讨论】:

标签: javascript oop methods properties instances


【解决方案1】:

这是Why can't I add properties to a string object in javascript? 的副本。

基本上,您正在创建一个字符串,这是 javascript 中的原始类型。

您不能在 javascript 中向原始类型添​​加属性

【讨论】:

    【解决方案2】:

    通过为foo 使用真正的字符串对象:

    var foo = new String('foo');
    foo.bar = 'baz';
    console.log(foo.bar); // 'baz'
    

    【讨论】:

    • +1 在 rhino 中对此进行了测试,并且可以正常工作。尽管 's' === new String('s') 评估结果为 false,因为它们具有不同的类型。我可以想象会导致错误的事情。
    • 不知道bug,我认为如果使用不当可能会导致bug。但是,嘿,这是所有代码,不是吗?无论如何,这一切都是可行的,但我必须说,我从来没有发现这种字符串扩展有多大用处。
    【解决方案3】:

    foo.bar = "baz";undefined = "baz"; 相同

    您可以使用它的原型向字符串添加函数;

    String.prototype.bar = function() {
        return "baz";
    };
    
    foo.bar() ; //# => baz
    

    【讨论】:

      【解决方案4】:

      当你指定 var foo = "foo";您要求将 foo 解释为字符串。字符串只能有文字作为值。它不能有任何其他子属性。 (只需将此逻辑扩展到您知道的任何其他oo编程语言,它就会变得更加清晰)。相反,您可以这样做。

       var fooObject = new Object()
      fooObject.foo = "foo"
      fooObject.bar = "baz"
      

      【讨论】:

        【解决方案5】:

        您说的是“原型设计”,即在 javascript 中向对象添加自定义属性的能力。

        这是一个关于原型设计的优秀而简洁的教程: http://www.javascriptkit.com/javatutors/proto.shtml

        【讨论】:

          【解决方案6】:

          要扩展 String 类,修改其原型:

          String.prototype.bar = "baz";
          var foo = "foo";
          console.log(foo); // "foo"
          console.log(foo.bar); // "baz"
          

          在您的问题中,您正在修改 String 类的实例而不是 String 类本身。

          【讨论】:

            猜你喜欢
            • 2012-02-21
            • 1970-01-01
            • 2017-08-27
            • 2011-03-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-28
            • 2010-11-21
            相关资源
            最近更新 更多