我是原型设计和实例化的新手,因此有一个问题:
例如:
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对象将完整无缺。
提前致谢!
答案 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_method
和Cool_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(){...}
我更喜欢在原型上定义方法而不是将它们放在构造函数中。它更干净,并且保存您的自定义数组对象不会被不必要的函数混乱。