2012-05-31 4 views
0

Я хочу создать функцию-конструктор в javascript, которая имеет свойство .prototype и может быть использована с новым ключевым словом для создания новых объектов, которые имеют это свойство в своих проточасах. Я также хотел бы, чтобы этот объект подклассифицировал Array.Создайте функцию конструктора JavaScript, которая подклассифицирует массив

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

SubArray = function() {this.push.apply(this, arguments);}; 
SubArray.prototype = Object.create(Array.prototype); 
SubArray.prototype.constructor = SubArray; 
SubArray.prototype.last = function(){return this[this.length -1]}; 

var arr = new SubArray(0); // [0] 
arr.push(1,2,3); // [0,1,2,3] 
console.log(arr, arr.length); // [0,1,2,3], 4 
arr.length = 2; 
console.log(arr, arr.length); // [0,1], 2 
console.log(arr.last()); // 2         
console.log(arr instanceof Array); // true 
console.log(arr instanceof SubArray); // true 

Я прочитал, что, добавляя определенные ключи к объекту arr, он может использоваться как функция-конструктор. Я считаю, что мне нужно было сделать что-то подобное.

var arrayFunction = new SubArray(0); // [0] 
arrayFunction.prototype = { 
    constructor: arrayFunction, 
    //shared functions 
}; 
arrayFunction.call = function(){//this would be the constructor?}; 
arrayFunction.constructpr = function(){//I remember seeing this as well, but I can't find the original source where I saw this}; 

Я бы очень признателен за любую понимание того, как это можно сделать, заранее спасибо за вашу помощь

+0

Простым вопросом может быть, можете ли вы превратить объект javascript в конструктор, добавив такие методы, как вызов? – MiGnH

+1

-Я сомневаюсь. Объект, используемый с 'new', должен реализовать внутренний метод' [[Construct]] '([ES5 11.2.2] (http://es5.github.com/#x11.2.2)), только функции имеют такой метод (это функция Function.prototype). – RobG

+0

Это неудачно, я думаю, мне придется согласиться на то, что у меня есть сейчас. если бы это был ответ, я бы принял его. – MiGnH

ответ

0

я помню Резиг пытался подклассы массив для Jquery, но нашел, что это не представляется возможным.

+0

Код, который у меня выше, создает довольно функциональный подкласс Array, единственное, что не работает (что я знаю), - это когда вы делаете что-то вроде: arr = new SubArray (1,2,3); arr [10] = 10; arr будет [1,2,3] не [1,2,3, undefined, ..., 10]. Мой вопрос касался одновременного подкласса массива и функции – MiGnH

+0

. Обратите внимание, что после утверждения 'arr [10] = 10;' члены с 3 по 9 не определены (т. Е. Они не существуют), поэтому литерал эквивалентного массива будет быть '[1,2,3 ,,,,,,, 10]', промежуточные элементы эффективно устраняются. – RobG

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