2010-07-21 2 views
3

Предположим, что я придумал определенную функцию сортировки, которую хочу поместить в прототип некоторого объекта на основе массива (я сам здесь использую Array). Я могу сделатьМожет ли метод узнать «это» своего родительского объекта?

Array.prototype.specialSort = function... 

но то, что я действительно хотел сделать, это

Array.prototype.sort.special = function... 

проблема, конечно, в том, что, когда она называется, она не будет знать об объекте Array, он будет знать только о сортировке, поэтому он не может сортировать. Есть ли магическое заклинание, чтобы пройти «это» вниз по дереву?

Вторичный вопрос (так как ответ на основной вопрос, скорее всего, «нет»): Что бы вы сделали, чтобы реализовать понятие «под-методов» с максимальной элегантностью?

+0

Непонятный вопрос. Кроме того, указатель «this» имеет ** ничего **, чтобы определить, как определена функция. Это полностью определено во время вызова. – Pointy

+1

Кроме того, не утруждайте себя попыткой подкласса Array - вам действительно не удастся добиться этого: http://perfectionkills.com/how-ecmascript-5-still-does-not-allow-to-subclass-an-array/ – Pointy

+0

Pointy: Указатель «this» используется при определении метода, который я надеюсь делать здесь. Это будет метод сортировки, но вместо того, чтобы переопределять встроенный метод сортировки, это будет отличный метод. Но поскольку это метод, который сортируется, и потому, что у меня может быть несколько специальных функций сортировки, было бы желательно, чтобы они «группировали» их все в рамках существующей функции сортировки. Но если я это сделаю, они не знают о массиве, который они должны сортировать. –

ответ

1

Это должно быть довольно близко к тому, что вы хотите:

Array.prototype.sort = function() { 
    return { 
     self: this; 
    , special: function() { 
     return sortLogic (self); 
     } 
    }; 
}; 

var xs = [1, 2, 3]; 
xs.sort().special(); 

Другим вариантом было бы использовать Function.prototype.call или Function.prototype.apply, особенно если вы хотите arr.sort() для сортировки списка в обычном режиме.

Array.prototype.sort.special.call (arr, arg1, arg2, etc); 

С помощью второго способа над первым позволяет легко использовать call и apply методы по методу sort.special. Может быть полезно, если делать что-то вроде следующего:

function() { 
    Array.prototype.sort.special.call (arguments); 
} 

Если вы хотите, оба мира, что-то подобное может работать:

Array.prototype.sort = (function() { 
    var special = function() { 
    if (this [0] > this [1]) { 
     var tmp = this [0]; 
     this [0] = this [1]; 
     this [1] = tmp; 
    } 
    return this; 
    }; 
    var sort = function() { 
    var context = this; 
    return { 
     special: function() { 
     return special.apply (context, arguments) 
     } 
    }; 
    }; 
    sort.special = special; 
    return sort; 
})(); 


/*** Example Below ***/ 


function foo() { 
    Array.prototype.sort.special.call (arguments); 
    var xs = [5, 2, 3]; 
    xs.sort().special(); 
    alert (arguments); 
    alert (xs); 
} 

foo (9, 6); 
+0

Я не думаю, что он хочет переопределить функцию «сортировки» на собственном массиве – Pointy

0

Спасибо за руководством и к заостренными и trinithis. Думаю, я сейчас понимаю. Суть заключается в том, что, хотя sort() является методом массива, если он не вызывается, это просто член (или свойство), поэтому он не имеет этого. Я хотел получить «это», если бы это было вызвано. И так как я вызывал что-то в конце цепи, я как бы надеялся, что есть какая-то магия, которая сохранит все это методом-y. Но нет.

Что бы я мог сделать, это иметь отдельный метод «сортировки», чтобы действовать как группонер для моих специальных методов и оставить существующий вид в одиночку.

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