【问题标题】:Javascript prototypes - what's the advantage in this case?Javascript 原型 - 在这种情况下有什么优势?
【发布时间】:2014-03-17 18:39:43
【问题描述】:

“哦,不”,我听到你呻吟,“不要再问这个问题了”,但请耐心等待一分钟。

我正在努力掌握原型设计,并且我了解跨对象实例共享通用功能的好处。但是,在以下情况下,使用原型而不是单独的函数可以获得什么?

我想取一个句子并将每个单词的位置随机化,所以我可以执行以下操作:

Array.prototype.shuffle = function() {
var i = this.length;
if (i == 0) return this;
while (--i) {
    var j = Math.floor(Math.random() * (i + 1 ));
    var a = this[i];
    var b = this[j];
    this[i] = b;
    this[j] = a;
}

    return this;
};

function randomiser(){
    var s = "My name is Bob";
    var shuffledSentence = s.split(' ').shuffle().join(' ');
    console.log(shuffledSentence); // "Bob My name is"

}

或者,我可以使用一个简单的函数调用来随机化我的字符串:

function randomise(arrayToRandomise){
    var i = arrayToRandomise.length;
    if (i == 0) return arrayToRandomise;
    while (--i) {
        var j = Math.floor(Math.random() * (i + 1 ));
        var a = arrayToRandomise[i];
        var b = arrayToRandomise[j];
        arrayToRandomise[i] = b;
        arrayToRandomise[j] = a;
    }

    return arrayToRandomise;
}

 function randomiser(){
    var s = "My name is Bob";
    var shuffledSentence = s.split(' ');//.shuffle().join(' ');
    var myShuffledString = this.randomise(shuffledSentence).join(' ');
    console.log(myShuffledString);  // "Bob My name is"
}

使用原型我在这里获得了什么(除了更优雅的代码!)?

【问题讨论】:

标签: javascript prototype


【解决方案1】:

它们之间没有区别或任何优缺点,我选择第二种解决方案,因为我们最好不要修改 JavaScript 原生原型,除非(我同意修改原生原型的唯一情况)涵盖一些跨浏览器的问题。例如,如果您的浏览器不支持 forEach in Array,因为您可能在代码中需要它,恕我直言,将它添加到您的 Array.prototype 并不是一件坏事。

但要做到这一点,更好的方法是以不影响任何内容的方式编写代码,例如当您像这样更改 Array.prototype 时:

Array.prototype.shuffle = ...

那么如果你用for(..in) 迭代数组,你的随机播放就会出现。

所以如果我是你并且我想修改原生原型,我会这样做:

Object.defineProperty(Array.prototype, "shuffle", {
    enumerable:false,
    value:function(){
        //your code
    }
});

这样,使用 enumerable 属性,您可以防止它出现在 for(..in) 循环或 Object.keys() 中。

【讨论】:

    【解决方案2】:

    对此我没有太多要说的,但恕我直言,这里有几点:

    • prototype 最好不要扩展到原生对象,这有点类似于污染全局命名空间,但这有点见仁见智。
    • prototype 实际上只是 OO 的一个构造,从哲学上讲只是让代码更优雅,所以在这种情况下,我认为这就是原型在这里所做的全部。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 2013-04-23
      • 2013-07-22
      相关资源
      最近更新 更多