2015-02-12 2 views
-1

В чем разница между тем, когда с помощью метода цепочки в Javascript Я знаю, что это может иметь какие-то странные причуды, так что я не уверен:Javascript определение метода цепочки

var Kitten = function() { 
    this.name = 'Garfield'; 
    this.color = 'brown'; 
    this.gender = 'male'; 
}; 

Kitten.prototype.setName = function(name) { 
    this.name = name; 
    return this; 
}; 

Kitten.prototype.setColor = function(color) { 
    this.color = color; 
    return this; 
}; 

var obj = new Kitten().setName("tom").setColor("red"); 

И

var Kitten = function() { 
    this.name = 'Garfield'; 
    this.color = 'brown'; 
    this.gender = 'male'; 
    this.setColor = function(color) { 
    this.color = color; 
    return this; 
    }; 
    this.setName = function(name) { 
    this.name = name; 
    return this; 
    }; 

};

var obj = new Kitten().setName("tom").setColor("red"); 
+0

Во второй версии все котята будут иметь собственные копии функций 'setColor' и' setName'. В первом они будут использовать определения из прототипа. Итак, если вы не планируете иметь разные определения для разных котят, то первое лучше. – techfoobar

ответ

4

Результат такой же, с точки зрения вызова кода, разница между реализациями заключается в следующем:

Если у вас есть функции, называемые в функции инстанцировании, они создаются каждый раз, когда вы создаете new объект. Когда они создаются на прототипе, эти функции распределяются между всеми экземплярами.

У обоих есть свои преимущества и недостатки - вы можете использовать внутренние функции для создания чего-то вроде «частных» переменных-членов, которые вы можете увидеть на других языках, и реализовать шаблон модуля, который широко используется среди разработчиков JavaScript, но если вы собираетесь для создания множества объектов, тогда общие функции прототипа могут быть намного эффективнее с точки зрения памяти. В наши дни люди мало думают об эффективности памяти, но если вы ориентируетесь на мобильные платформы, это может быть актуальным.

Я предпочитаю использовать прототипы, потому что он чувствует ко мне, как если бы это происходило более естественно с потоком языка, но, как и со всей серьезной разработкой JavaScript, это означает, что иногда вы оказываетесь в сложных сценариях обзора.

1

Нет никакой разницы.

Когда вы используете this внутри объекта, вы помещаете значения в объект.

Вы автоматически добавить имя свойства в объект Kitten:

var Kitten = function() { 
    this.name = 'Garfield'; 
} 

Вы явно добавить имя в Kitten прототипа из-за пределов:

var Kitten = function() { 
} 

Kitten.prototype.name = "Garfield"; 

Прототип разделяется между объектами при использовании new Kitten() и то, что было создано внутри функции с this будет воссоздана.

+0

в первом случае свойство добавлено не в прототипе, а непосредственно в объекте – Grundy

+0

Вы правы! Починил это – nanndoj

Смежные вопросы