Тим Даун, я думаю, это правильно. Я думаю, что как только вы дойдете до того момента, когда, по вашему мнению, вам нужно будет различать два режима вызова, вам не следует использовать ключевое слово "this
". this
ненадежен и может быть глобальным объектом или совершенно другим объектом. Дело в том, что нежелательно иметь функцию с этими различными способами активации, некоторые из которых работают так, как вы хотели, а другие делают что-то совершенно дикое. Я думаю, может быть, вы пытаетесь понять это из-за этого.
Существует идиоматический способ создания функции-конструктора, которая ведет себя одинаково независимо от того, как она вызывается. будь то Thing (), новый Thing () или foo.Thing (). Это выглядит так:
function Thing () {
var that = Object.create(Thing.prototype);
that.foo="bar";
that.bar="baz";
return that;
}
где Object.create - это новый стандартный метод ecmascript 5, который может быть реализован в обычном javascript следующим образом:
if(!Object.create) {
Object.create = function(Function){
// WebReflection Revision
return function(Object){
Function.prototype = Object;
return new Function;
}}(function(){});
}
Object.create примет объект в качестве параметра и вернет новый объект с тем, что передано в объекте в качестве его прототипа.
Если, однако, вы действительно пытаетесь заставить функцию вести себя по-разному в зависимости от того, как она вызывается, то вы плохой человек и не должны писать код JavaScript.