在JavaScript中复制和扩展全局对象

5
有没有办法复制一个全局对象(Array,String等),并扩展复制的对象原型而不影响原始对象?我尝试了这个方法:
var copy=Array;
copy.prototype.test=2;

但是,如果我检查 Array.prototype.test ,它的值为2,因为数组对象是按引用传递的。我想知道是否有一种方法可以使“copy”变量表现得像一个可以扩展的数组,但不会影响原始的 Array 对象。


我假设第一行实际上是这样写的:var copy=Array; - Sean Hogan
创建类似于数组的“类”请参见https://dev59.com/Y3RC5IYBdhLWcg3wP-dh另外,您似乎不理解JavaScript继承。您应该搜索类似于“JavaScript原型继承”的内容。 - Sean Hogan
3个回答

2

好问题。我有预感您可能需要编写一个包装类来解决这个问题。实际上,copy.prototype.test=2 是在设置一个类原型,这将对该类的所有实例(当然)都可见。


你有包装类的示例吗? - mck89
@mck89:抱歉,我没有注意到你在这里的评论。S.O.的通知功能需要改进,哈哈。我想你成功地解决了包装类的问题? - Codesleuth

1

我认为http://dean.edwards.name/weblog/2006/11/hooray/中的示例之所以不起作用是因为它是匿名函数。 因此,应该使用以下方式:

// create the constructor
var Array2 = function() {
  // initialise the array
};

// inherit from Array
Array2.prototype = new Array;

// add some sugar
Array2.prototype.each = function(iterator) {
// iterate
};

你可能想要这样的东西:
function Array2() {

}
Array2.prototype = new Array();

从我的测试来看,在IE中,length属性在这种继承方式下是被保留的。此外,添加到MyArray.prototype的任何内容似乎都不会被添加到Array.prototype中。希望这可以帮到你。

0

不要扩展原型,为什么不直接扩展复制变量呢?例如,添加一个函数

copy.newFunction = function(pParam1) { 
      alert(pParam1);
};

因为这样,如果我创建一个copy的新实例,它将没有该方法,因为它只会使用原型方法。无论如何,这并不能解决问题,因为它也扩展了原始的Array对象。 - mck89

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接