自定义数组对象

时间:2013-01-11 00:22:20

标签: javascript prototype

我是原型设计和实例化的新手,因此有一个问题:

  • 如何创建一个构造新数组的函数,该数组也有一些属性添加了原型但没有修改默认的Array函数?

例如:

function Cool_Object() {
    this = new Array() // Construct new array.
    //This is only for the example. I know you can't do that.
}
Cool_Object.prototype.my_method = function() {
    // Some method added
};

所以,如果你打电话:

var myObject = new Cool_Object();

myObject将是一个数组,并且有一个名为“my_method”的方法(实际上调用了一个函数)。

但默认的Array对象将完整无缺。

提前致谢!

5 个答案:

答案 0 :(得分:9)

你有点倒退了。只需使用Array.prototype作为自定义对象的原型。

function Cool_Object() {

    this.my_method = function () {
        return 42;
    }
}

Cool_Object.prototype = Array.prototype;

var foo = new Cool_Object();
foo.my_method(); // 42
foo.push(13);
foo[0]; // 13

通过引入中间类型,您可以在Array.prototype的原型上同时获得my_methodCool_Object,而无需修改Array.prototype

function Even_Cooler() {}
Even_Cooler.prototype = Array.prototype;

function Cool_Object() {}
Cool_Object.prototype = new Even_Cooler();

Cool_Object.prototype.my_method = function () {
    return 42;
}

答案 1 :(得分:5)

您不能只分配给this,它不起作用并抛出ReferenceError。只需Cool_Object延长Array即可。

一种方法:

var Cool_Object = Object.create(Array.prototype);
Cool_Object.my_method = function() {
    // Some method added
};

然后使用

创建更多对象
var obj = Object.create(Cool_Object);

答案 2 :(得分:0)

使用数组作为函数的原型,以便新类型从Array“继承”,然后在原型中引入新方法:

function CustomArray() {}

CustomArray.prototype = [];

// introduce a new method to your custom array type
CustomArray.prototype.total = function() {
    return this.reduce(function(ret, el) {
        return ret+el;
    }, 0);
};

// introduce another new method to your custom array type
CustomArray.prototype.arithmetiMean = function() {
    return this.total()/this.length;
};

或者,您可以在新实例中引入这些方法:

function CustomArray() {
    // introduce a new method to your custom array object
    this.total = function() {
        return this.reduce(function(ret, el) {
            return ret+el;
        }, 0);
    };

    // introduce another new method to your custom array object    
    this.arithmetiMean = function() {
        return this.total()/this.length;
    };
}

CustomArray.prototype = [];

var arr = new CustomArray();

arr.push(1); // push is an array-standard method
arr.push(2);
arr.push(3);
arr.push(4);
arr.push(5);
arr.push(6);
arr.push(7);
arr.push(8);
arr.push(9);
arr.push(10);

console.log(arr.arithmetiMean());

答案 3 :(得分:0)



function PseudoArray() {

};
PseudoArray.prototype = Object.defineProperties(Object.create(Array.prototype), {
	constructor: {value:PseudoArray}
})




答案 4 :(得分:-1)

添加这个作为参考,因为现在大多数浏览器都支持Object.create,制作自己的数组对象的好方法是这样的:

{{1}}

使用jQuery的$ .extend,因为保持代码结构很方便,但是没有必要,你可以这样做:

MyCustomArray.prototype = Object.create(Array.prototype);

MyCustomArray.prototype.push = function(){...}

我更喜欢在原型上定义方法而不是将它们放在构造函数中。它更干净,并且保存您的自定义数组对象不会被不必要的函数混乱。