我在字符串上有两个完全相同的函数示例:
//ex1 - inherited method
String.prototype.slugLower = function() {
return this.split(' ').join('-').toLowerCase();
}
"hello World".slugLower();
//ex2 - static method
String.slugLower = function(str) {
return str.split(' ').join('-').toLowerCase();
}
String.slugLower("hello World");
两者都将返回"hello-world"
。他们之间有什么区别?我的意思是表现/最佳实践。
由于
答案 0 :(得分:3)
第一种是附加到原型的方法。第二个是附加到String
对象的方法。在经典的OO语言中,它们将被称为"继承方法"和"静态方法"分别。
性能差异微不足道,这里真的不重要。应该是什么:如果你认为一个方法是一个对象类中每个对象的行为,它应该是一个原型(继承)方法。如果您认为它应该是与类的多个对象或类本身相关的行为,则应使用第二种模式。例如,"撒尿"或者"大声吠叫"是每只狗的行为:Dog.prototype.peeOn
,Dog.prototype.barkWithVolume
; "世界上有多少只狗?"或者"做一条新狗"不是每只狗的行为,而是“狗狗”和#34;还有一对狗:Dog.census
和Dog.spawnPuppy
。
答案 1 :(得分:2)
原型中定义的方法将在所有Object中可用。对于大多数用例,'your object'.protoype
将是最佳做法。
另一个例子:
var myObject = function monObject() {
/*...*/
this.function1 = function function1() {
/*...*/
};
};
myObject.prototype.function2 = function function2() {
/*...*/
};
然后,如果您创建2个对象
var obj1 = new myObject();
var obj2 = new myObject();
然后你有这个:
obj1.function1 !== obj2.function1
但是:
obj1.function2 === obj2.function2
每个新function1()
都会重新创建 myObject
。
它清楚了吗?
答案 2 :(得分:0)
最佳做法是定义执行此操作的功能
function slugLower(str){
return str.split(' ').join('-').toLowerCase();
}
你的两个例子都会改变String对象,有一些副作用,第一个例子是instance method
,第二个例子是static function