adding automatic 'return this' for constructors: functions that start with a Capital Letter

This commit is contained in:
Jeremy Ashkenas
2010-01-06 23:47:36 -05:00
parent 9ed8020b84
commit 18c3e79a50
3 changed files with 24 additions and 9 deletions

View File

@@ -6,7 +6,9 @@
return alert(this.name + " moved " + meters + "m."); return alert(this.name + " moved " + meters + "m.");
}; };
Snake = function Snake(name) { Snake = function Snake(name) {
return this.name = name; var __a;
__a = this.name = name;
return Snake === this.constructor ? this : __a;
}; };
Snake.__superClass__ = Animal.prototype; Snake.__superClass__ = Animal.prototype;
Snake.prototype = new Animal(); Snake.prototype = new Animal();
@@ -16,7 +18,9 @@
return Snake.__superClass__.move.call(this, 5); return Snake.__superClass__.move.call(this, 5);
}; };
Horse = function Horse(name) { Horse = function Horse(name) {
return this.name = name; var __a;
__a = this.name = name;
return Horse === this.constructor ? this : __a;
}; };
Horse.__superClass__ = Animal.prototype; Horse.__superClass__ = Animal.prototype;
Horse.prototype = new Animal(); Horse.prototype = new Animal();

View File

@@ -1001,7 +1001,9 @@ Animal <span class="Keyword">=</span> <span class="Storage">function</span> <spa
<span class="Keyword">return</span> <span class="LibraryFunction">alert</span>(<span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span> moved <span class="String">&quot;</span></span> <span class="Keyword">+</span> meters <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span>m.<span class="String">&quot;</span></span>); <span class="Keyword">return</span> <span class="LibraryFunction">alert</span>(<span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span> moved <span class="String">&quot;</span></span> <span class="Keyword">+</span> meters <span class="Keyword">+</span> <span class="String"><span class="String">&quot;</span>m.<span class="String">&quot;</span></span>);
}; };
Snake <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">Snake</span>(<span class="FunctionArgument">name</span>) { Snake <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">Snake</span>(<span class="FunctionArgument">name</span>) {
<span class="Keyword">return</span> <span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> name; <span class="Storage">var</span> __a;
__a <span class="Keyword">=</span> <span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> name;
<span class="Keyword">return</span> Snake <span class="Keyword">===</span> <span class="Variable">this</span>.<span class="LibraryConstant">constructor</span> ? <span class="Variable">this</span> : __a;
}; };
Snake.__superClass__ <span class="Keyword">=</span> Animal.<span class="LibraryConstant">prototype</span>; Snake.__superClass__ <span class="Keyword">=</span> Animal.<span class="LibraryConstant">prototype</span>;
<span class="LibraryClassType">Snake</span>.<span class="LibraryConstant">prototype</span> = <span class="Keyword">new</span> <span class="TypeName">Animal</span>(); <span class="LibraryClassType">Snake</span>.<span class="LibraryConstant">prototype</span> = <span class="Keyword">new</span> <span class="TypeName">Animal</span>();
@@ -1011,7 +1013,9 @@ Snake.__superClass__ <span class="Keyword">=</span> Animal.<span class="LibraryC
<span class="Keyword">return</span> Snake.__superClass__.move.<span class="LibraryFunction">call</span>(<span class="Variable">this</span>, <span class="Number">5</span>); <span class="Keyword">return</span> Snake.__superClass__.move.<span class="LibraryFunction">call</span>(<span class="Variable">this</span>, <span class="Number">5</span>);
}; };
Horse <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">Horse</span>(<span class="FunctionArgument">name</span>) { Horse <span class="Keyword">=</span> <span class="Storage">function</span> <span class="FunctionName">Horse</span>(<span class="FunctionArgument">name</span>) {
<span class="Keyword">return</span> <span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> name; <span class="Storage">var</span> __a;
__a <span class="Keyword">=</span> <span class="Variable">this</span>.<span class="LibraryConstant">name</span> <span class="Keyword">=</span> name;
<span class="Keyword">return</span> Horse <span class="Keyword">===</span> <span class="Variable">this</span>.<span class="LibraryConstant">constructor</span> ? <span class="Variable">this</span> : __a;
}; };
Horse.__superClass__ <span class="Keyword">=</span> Animal.<span class="LibraryConstant">prototype</span>; Horse.__superClass__ <span class="Keyword">=</span> Animal.<span class="LibraryConstant">prototype</span>;
<span class="LibraryClassType">Horse</span>.<span class="LibraryConstant">prototype</span> = <span class="Keyword">new</span> <span class="TypeName">Animal</span>(); <span class="LibraryClassType">Horse</span>.<span class="LibraryConstant">prototype</span> = <span class="Keyword">new</span> <span class="TypeName">Animal</span>();
@@ -1031,7 +1035,9 @@ Animal.prototype.move = function move(meters) {
return alert(this.name + " moved " + meters + "m."); return alert(this.name + " moved " + meters + "m.");
}; };
Snake = function Snake(name) { Snake = function Snake(name) {
return this.name = name; var __a;
__a = this.name = name;
return Snake === this.constructor ? this : __a;
}; };
Snake.__superClass__ = Animal.prototype; Snake.__superClass__ = Animal.prototype;
Snake.prototype = new Animal(); Snake.prototype = new Animal();
@@ -1041,7 +1047,9 @@ Snake.prototype.move = function move() {
return Snake.__superClass__.move.call(this, 5); return Snake.__superClass__.move.call(this, 5);
}; };
Horse = function Horse(name) { Horse = function Horse(name) {
return this.name = name; var __a;
__a = this.name = name;
return Horse === this.constructor ? this : __a;
}; };
Horse.__superClass__ = Animal.prototype; Horse.__superClass__ = Animal.prototype;
Horse.prototype = new Animal(); Horse.prototype = new Animal();

View File

@@ -100,9 +100,12 @@ module CoffeeScript
if node.statement? if node.statement?
node.compile(o.merge(:return => true)) node.compile(o.merge(:return => true))
else else
constructor = o[:top] && o[:last_assign] && o[:last_assign][0..0][/[A-Z]/] if o[:top] && o[:last_assign] && o[:last_assign][0..0][/[A-Z]/]
prefix = constructor ? "if (#{o[:last_assign]} !== this.constructor) " : '' temp = o[:scope].free_variable
"#{o[:indent]}#{prefix}return #{node.compile(o)};" "#{o[:indent]}#{temp} = #{node.compile(o)};\n#{o[:indent]}return #{o[:last_assign]} === this.constructor ? this : #{temp};"
else
"#{o[:indent]}return #{node.compile(o)};"
end
end end
else else
ending = node.statement? ? '' : ';' ending = node.statement? ? '' : ';'