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
数组时。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标准模式):