Javascript原型 - 在这种情况下有什么优势?

时间:2014-02-18 07:04:54

标签: javascript prototype

“哦不”,我听到你呻吟,“不再是这个问题了”,但请耐心等了一会儿。

我正在努力掌握原型设计,并了解在对象实例之间共享通用功能的好处。但是,在下面的例子中,我通过使用原型而不仅仅是一个独立的函数获得了什么?

我想要一个句子并随机化每个单词的位置,所以我可以做以下事情:

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"
}

我通过使用原型获得了什么(除了更优雅的代码之外!)?

2 个答案:

答案 0 :(得分:1)

我对此没什么好说的,但恕我直言这里有一些观点:

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

答案 1 :(得分:1)

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

但重点是更好的方法是以不影响任何事情的方式对代码进行编码,例如当您更改Array.prototype时:

Array.prototype.shuffle = ...

然后,如果您使用for(..in)迭代数组,则会显示您的随机播放。

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

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

这样,使用枚举属性,可以防止它显示在for(..in)循环或Object.keys()中。