fixed condext during construction of bound functions; now using native

Function::bind when it is available. related: #1363
This commit is contained in:
Michael Ficarra
2011-05-27 18:03:57 -04:00
parent 085874d5f3
commit 8d6e33c2cf
3 changed files with 29 additions and 7 deletions

View File

@@ -7,7 +7,17 @@
child.prototype = new ctor;
child.__super__ = parent.prototype;
return child;
}, __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, __indexOf = Array.prototype.indexOf || function(item) {
}, __bind = (Function.prototype.bind ? Function.prototype.call.bind(Function.prototype.bind) : function(fn, me){
return function bound(){
if (!(this instanceof bound))
return fn.apply(me, arguments);
var ctor = function(){};
ctor.prototype = fn.prototype;
var obj = new ctor();
fn.apply(obj, arguments);
return obj;
};
}), __indexOf = Array.prototype.indexOf || function(item) {
for (var i = 0, l = this.length; i < l; i++) {
if (this[i] === item) return i;
}
@@ -2248,7 +2258,7 @@
};
UTILITIES = {
"extends": 'function(child, parent) {\n for (var key in parent) { if (__hasProp.call(parent, key)) child[key] = parent[key]; }\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor;\n child.__super__ = parent.prototype;\n return child;\n}',
bind: 'function(fn, me){ return function(){ return fn.apply(me, arguments); }; }',
bind: ' (Function.prototype.bind ? Function.prototype.call.bind(Function.prototype.bind) : function(fn, me){\n return function bound(){\n if (!(this instanceof bound))\n return fn.apply(me, arguments);\n var ctor = function(){};\n ctor.prototype = fn.prototype;\n var obj = new ctor();\n fn.apply(obj, arguments);\n return obj;\n };\n})',
indexOf: 'Array.prototype.indexOf || function(item) {\n for (var i = 0, l = this.length; i < l; i++) {\n if (this[i] === item) return i;\n }\n return -1;\n}',
hasProp: 'Object.prototype.hasOwnProperty',
slice: 'Array.prototype.slice'

View File

@@ -1769,7 +1769,17 @@ UTILITIES =
# Create a function bound to the current value of "this".
bind: '''
function(fn, me){ return function(){ return fn.apply(me, arguments); }; }
(Function.prototype.bind ? Function.prototype.call.bind(Function.prototype.bind) : function(fn, me){
return function bound(){
if (!(this instanceof bound))
return fn.apply(me, arguments);
var ctor = function(){};
ctor.prototype = fn.prototype;
var obj = new ctor();
fn.apply(obj, arguments);
return obj;
};
})
'''
# Discover if an item is in an array.

View File

@@ -431,10 +431,12 @@ test "`new` shouldn't add extra parens", ->
test "`new` works against bare function", ->
eq Date, new ->
eq this, new => this
Date
nonceA = {}
nonceB = null
eq nonceA, new ->
eq (new => nonceB = this), nonceB
notEqual this, new => this
nonceA
test "#1182: a subclass should be able to set its constructor to an external function", ->