Javascript 如何将某些内容插入到原型链中?
我有一个“类”,本质上是一个增强的Javascript 如何将某些内容插入到原型链中?,javascript,prototypal-inheritance,Javascript,Prototypal Inheritance,我有一个“类”,本质上是一个增强的数组: function NamedArray(name) { var result = []; result.name = name; return result; }; var cheeses = new NamedArray('Cheeses'); function NamedArray(name) { var result = []; result.name = name; for (var prop in NamedArra
数组
:
function NamedArray(name) {
var result = [];
result.name = name;
return result;
};
var cheeses = new NamedArray('Cheeses');
function NamedArray(name) {
var result = [];
result.name = name;
for (var prop in NamedArray.prototype) {
if (NamedArray.prototype.hasOwnProperty(prop) {
result[prop] = NamedArray.prototype[prop];
}
}
return result;
};
这很有效。不起作用的是为这个“类”添加一个原型:
这是可行的,但会导致每个实例都有自己的原型属性副本。是否有方法将NamedArray.prototype插入结果的prototype链中
数组
?James
问题是,您的“构造函数”返回的不是由new
创建的新分配对象,而是其他对象。(而是从构造函数内部创建一个数组,并返回该数组。)
<> p>为了纠正构造函数代码的这种混淆方面,请考虑如下类似的内容:
function NamedArray(name) {
this.name = name;
};
NamedArray.prototype = new Array();
NamedArray.prototype.nameInAllCaps = function() {
return this.name.toUpperCase();
}
c = new NamedArray("cheeses");
console.log(c.name);
console.log(c.nameInAllCaps());
我认为这个问题是重复的:它肯定非常接近。不过,在这种情况下,我不愿意将东西合并到实际的
数组.prototype
,因为我不希望它们出现在每个数组中,只是NamedArray
s。我还没有弄清楚如何插入到prototype链中作为一个实例,但是我找到了解决问题的另一种方法:返回实际的NamedArray
实例并设置NamedArray.prototype=newarray()代码>。这给了NamedArray
s完整的Array
般的支持!然而,需要预先警告的是,当您尝试以这种方式从数组继承时,IE的常用版本(例如8和9[我没有对该版本做过很多检查])可能会表现得非常非常奇怪。如果您的项目需要生产级别的稳定性,我不建议您这样做。从理论上讲,它当然有效。。。但还有微软。请查看,第二个(但由于某种原因没有“回答”)答案(Erik的)解释了处理阵列时的一些情况。有效,但并非无处不在。IE在某些浏览器中的prototype=new Array()
it存在问题(看起来它可以正常工作,但访问器不能正常工作)。
function NamedArray(name) {
this.name = name;
};
NamedArray.prototype = new Array();
NamedArray.prototype.nameInAllCaps = function() {
return this.name.toUpperCase();
}
c = new NamedArray("cheeses");
console.log(c.name);
console.log(c.nameInAllCaps());