“哦不”,我听到你呻吟,“不再是这个问题了”,但请耐心等了一会儿。
我正在努力掌握原型设计,并了解在对象实例之间共享通用功能的好处。但是,在下面的例子中,我通过使用原型而不仅仅是一个独立的函数获得了什么?
我想要一个句子并随机化每个单词的位置,所以我可以做以下事情:
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"
}
我通过使用原型获得了什么(除了更优雅的代码之外!)?
答案 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()
中。