继承方法(prototype)和静态方法(表达式)有什么区别?

时间:2016-10-07 07:39:55

标签: javascript prototype

我在字符串上有两个完全相同的函数示例:

//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"。他们之间有什么区别?我的意思是表现/最佳实践。

由于

3 个答案:

答案 0 :(得分:3)

第一种是附加到原型的方法。第二个是附加到String对象的方法。在经典的OO语言中,它们将被称为"继承方法"和"静态方法"分别。

性能差异微不足道,这里真的不重要。应该是什么:如果你认为一个方法是一个对象类中每个对象的行为,它应该是一个原型(继承)方法。如果您认为它应该是与类的多个对象或类本身相关的行为,则应使用第二种模式。例如,"撒尿"或者"大声吠叫"是每只狗的行为:Dog.prototype.peeOnDog.prototype.barkWithVolume; "世界上有多少只狗?"或者"做一条新狗"不是每只狗的行为,而是“狗狗”和#34;还有一对狗:Dog.censusDog.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