关于在javascript中继承数组对象的属性
About inheriting the properties of the array object in javascript
我刚开始学习JavaScript中的继承概念。在这种情况下,我想继承Array对象并为其添加功能。我在这里面临的问题是,third
方法正在正确执行,但show()
方法抛出一个错误,指出show()
不是一个函数。
var a = [1,2,3,4,5];
Array.prototype = {
third:function(){
console.log(a[3]);
},
show:function(){
console.log(a);
}
};
a.third();
a.show();
问题是你的代码试图用一个只具有你分配的属性的普通对象替换内置原型(它本身是一个数组)。不是替换原型,而是在已经存在的原型上添加属性,例如
Array.prototype.third = function() {
console.log(a[3]);
}
同样,由于在替换 array之前创建了一个数组。Prototype ,它得到的是旧原型,而不是新原型(如果添加了新原型)。这两种方法都会抛出错误,而不仅仅是show。如果你在创建和之前修改原型,它会在允许覆盖内置原型的浏览器中"工作"。它将不能在ECAMScript ed 3(或更早)实现中工作,也不能在Array中工作。原型有以下属性:
{ [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }
所以你不能替换它并且对象本身有属性:
{ [[Writable]]: true, [[Enumerable]]: false, [[Configurable]]: false }
如果你愿意,你可以添加属性和覆盖内置方法。
请注意,扩展内置对象通常会受到警告,请参阅扩展内置本机。
可以这样做:
var array = [1,2,3,4,5];
Array.prototype.third = function () { console.log(this[3]); }
Array.prototype.show = function () { console.log(this); }
array.third();
array.show();
如果你打算向原生原型添加方法,你真的需要做一个检查,这样你就可以确保你没有覆盖任何重要的东西。那么,以你的例子为例,稍微改变一下:
if (!('third' in Array.prototype)) {
Array.prototype.third = function () {
return this[2];
};
}
[0, 1, 2, 3].third(); // 2
演示相关文章:
- 将数组对象传递到struts2中的操作类
- 如何使用jquery返回php-json数组对象
- 从其名称获取javascript数组对象
- 值未与数组对象绑定
- 如何按数组/对象值的倍数过滤对象数组
- 在表中显示数组对象
- 在数组对象中分组
- 将第二个或多个数组推送到数组对象 AngularJS 中
- 重新排列 JavaScript 数组/对象
- 键上的javascript数组对象过滤器
- handontable:在不更改数据数组/对象的情况下隐藏某些列
- 用于跟踪购物车可用性的Javascript数组/对象/哈希表
- 重建有角度的java脚本数组对象
- 对JSON数组对象进行排序
- 连接与数组对象相关的文本:方式和位置
- 哪些浏览器和版本支持将常见的类数组对象直接传递到fn.apply()
- 如何使用Handlebars循环数组对象和模板
- 是否可以引用JS数组/对象中的另一个元素
- Javascript中的名称索引-数组/对象
- 数组长度不等于数组对象