2015-05-10 3 views
2

Какое из следующих случаев лучше для производительности или надлежащих методов?Лучше ли объявлять переменные внутри или вне свойства прототипа?

СЛУЧАЙ # 1

function SomeClass() 
{ 
    this.someVar = null; 
    this.someFunc = function() {} 
} 

СЛУЧАЙ # 2

function SomeClass() {} 
SomeClass.prototype.someVar = null; 
SomeClass.prototype.someFunc = function() {} 

ответ

0

Я думаю, что первый из них будет быстрее

function SomeClass() 
{ 
    this.someVar = null; 
    this.someFunc = function() {} 
} 

, потому что в этом случае при обращении к someClassInstace.someFunc javascript не будет искать прототип для функции someFunc.

+0

Однако в другой статье я прочитал, что помещение функции внутри SomeClass сделает его медленнее, потому что нужно, чтобы создать его. (источник: http: //tobyho.com/2010/11/22/javascript-constructors-and/: «В первой версии каждый раз, когда вы создаете человека, для него будет создана новая функция sayHi, где, как и в вторая версия, только одна функция sayHi когда-либо создается и распределяется между всеми создаваемыми лицами - поскольку Person.prototype является их родителем. Таким образом, объявление методов в прототипе более эффективно с точки зрения памяти ».) Не уверен, что это правда Тхо. – Mark

+0

Объект создания @Mark может быть медленным, но при доступе к функции, в частности, он должен быть быстрым, но я не думаю, что это сильно повлияло бы на разницу в производительности. –

+0

* «Я думаю, что первый будет быстрее» * Разница будет *** *** инфинитезимальная даже если современные двигатели JavaScript не оптимизирующие компиляторы (которые они, делая даже, что бесконечно малое спорное). –

2

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

Остерегайтесь того, что размещение ссылок на объекты/массивы на прототипе, скорее всего, вызовет вас, так как (снова) все экземпляры будут разделять эти ссылки.

Методы ввода (ссылки на функции) на прототипе являются довольно стандартной практикой.


Вот пример получения подножки, поставив массив на прототипе:

function MyConstructor() { 
 
}; 
 
MyConstructor.prototype.theArray = []; // Don't do this unless you're really sure 
 

 
var a = new MyConstructor(); 
 
a.theArray.push("foo"); 
 
snippet.log(a.theArray.length); // 1 -- so far, everything seems fine 
 

 
var b = new MyConstructor(); 
 
b.theArray.push("bar"); 
 
snippet.log(b.theArray.length); // 2 -- huh?!?!
<!-- Script provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 --> 
 
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>

Причина, конечно, является то, что как a и b использованием такой же массив: один на прототипе.

1

, если они распределены между всеми экземплярами SomeClass. Лучше объявить их в прототипе, потому что они будут использовать одну и ту же ссылку, которая уменьшает объем памяти.

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

Примеры:

function SomeClass() {} 
SomeClass.prototype.someVar = null; 
SomeClass.prototype.someFunc = function() {} 

var a = new SomeClass(); 
var b = new SomeClass(); 
a.someFunc === b.someFunc //true because they share the same reference 

в конструкторе:

function SomeClass() 
{ 
    this.someVar = null; 
    this.someFunc = function() {} 
} 

var a = new SomeClass(); 
var b = new SomeClass(); 
a.someFunc === b.someFunc //false because the now have difference reference 
Смежные вопросы