Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/413.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript原型-什么';在这种情况下有什么好处?_Javascript_Prototype - Fatal编程技术网

Javascript原型-什么';在这种情况下有什么好处?

Javascript原型-什么';在这种情况下有什么好处?,javascript,prototype,Javascript,Prototype,“哦,不,”我听到你呻吟,“别再问这个问题了”,但请耐心等我一会儿 我正在努力掌握原型设计,我了解跨对象实例共享公共功能的好处。然而,在下面的例子中,我使用原型而不仅仅是一个独立的函数获得了什么 我想选一个句子,随机排列每个单词的位置,这样我可以做以下两种选择之一: Array.prototype.shuffle = function() { var i = this.length; if (i == 0) return this; while (--i) { var j = Math.

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

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

我想选一个句子,随机排列每个单词的位置,这样我可以做以下两种选择之一:

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

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

关于这一点,我没有太多要说的,但我有以下几点:

  • prototype
    最好不要扩展到本机对象,这有点类似于污染全局名称空间,但这在某种程度上是一个意见问题
  • prototype
    实际上只是一个面向对象的构造,从哲学上讲,它只是使代码更加优雅,所以在本例中,我认为prototype就是这样做的

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

但关键是更好的方法是以一种不影响任何东西的方式编写代码,比如当您更改
数组时。prototype
如下所示:

Array.prototype.shuffle = ...
Object.defineProperty(Array.prototype, "shuffle", {
    enumerable:false,
    value:function(){
        //your code
    }
});
然后,如果使用(…in)对数组进行
迭代,则会显示无序排列

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

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

通过这种方式,使用enumerable属性,您可以防止它出现在
for(…in)
循环或
Object.keys()

就个人而言,我不会更改本机对象的原型,因为它可能会中断
。。在
中,它显然打破了封装:在您自己定义的对象中使用原型可以使用已知模式进行继承、代码重用等(OOP标准模式):