【问题标题】:Updating object value from prototype function从原型函数更新对象值
【发布时间】:2012-12-20 22:10:09
【问题描述】:

我正在尝试这样做:

String.prototype.clear = function(){
    alert(this.value);
    this = ''; // I want to set value to '' here
}

var temp = 'Hello';
temp.clear();// After this step temp should be ''

但是我遇到了无效的左手赋值错误。我发现这个问题作为参考,但这并不是我真正想要的。 我还发现“this”是不可变的。

那么,有什么方法可以完成我的任务吗?我没有在任何地方使用它。只是在玩。 谢谢。

【问题讨论】:

标签: javascript object prototype


【解决方案1】:

您可以创建一个名为 MyMutableString 的类,例如:

function MyMutableString(s) {
   this.string = s;
   this.clear = function() {
      this.string = "";
   }
}

现在您创建一个实例并像这样使用它:

var s = new MyMutableString("my str");
s.clear(); // makes string stored inside object `s` empty
console.log(s.string);

【讨论】:

    【解决方案2】:

    简而言之:

    你不能。

    字符串是不可变的。字符串一旦生成,就永远无法更改。

    您必须将字符串设置为空字符串才能“清除”它

    var str = "String";
    str='';
    

    请注意,这不会更改字符串,而是将 str 设置为字符串的新实例,旧的实例会被垃圾回收

    它甚至比调用 Object 的 Prototypes 方法更短,它会做同样的事情。 而且您不必对原生 Objects 原型进行调整


    编辑 - 感谢您指出 Florian Margaine

    如果您经常设置空字符串并且可能会更改您未来的清除“定义”,您可以使用返回 `` 或空字符串的函数

    function clearString () {
        return ''
    }
    var str = "Asd"
    var str = clearString()
    

    或者简单地将一个变量设置为一个空字符串

    var emptyString = ''
    var str = "Asd"
    str = emptyString //''
    

    现在如果您想将'' 更改为nullundefined

    var emptyString = null

    这也可以,因为原始数据类型是作为值而不是通过引用传递的

    但我建议不要为这样的东西修改 Objects 原型

    【讨论】:

      【解决方案3】:

      这样的对象副本怎么样?

      String.prototype.clear = function(){
          alert(this);
          return '';
      }
      
      
      var temp = 'Hello';
      var newTemp = temp.clear();
      alert(newTemp);
      

      【讨论】:

        【解决方案4】:

        除了创建包装器之外,最好的方法是使用函数式方法。

        String.prototype.clear = function() {
            return '';
        };
        
        var t = 'hello';
        t = t.clear();
        

        你说为什么不直接做t = '';?好吧,今天清算可能意味着投入'',但可能意味着明天投入null。有一个点来改变它可能是值得的。或者根本没有。

        【讨论】:

        • 为什么要添加一个只返回 '' 的原型方法,你可以设置t = ''
        • @Glutamat 是的,我会这样做。但是一种方法可能很方便。另外,今天清算可能意味着投入'',但它可能意味着明天投入null
        • 没错,好点,您不必将t = '' 的每次出现都更改为t = null,但您可以使用简单的函数甚至变量来返回'' 没有将方法添加到String.prototype,因为您无法通过像t.clear() 这样的方法调用来清除它,但无论哪种方式都必须重新定义它t = t.clear =)
        猜你喜欢
        • 1970-01-01
        • 2016-03-03
        • 2021-11-27
        • 1970-01-01
        • 2012-06-19
        • 1970-01-01
        • 2015-03-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多