关于javascript中给数组新注册方法的后遗症

1514582970 发布于 2016/05/27 14:20
阅读 151
收藏 0

我在一个页面的js的开头加入了以下代码

Array.prototype.search = function (name, value)

{
    for (var li in this) {
        if (this[li][name] == value) {
            return this[li];
        }
    }
    return false;

};


这个方法因为我用的挺多的才加入的,

但是加入了这个方法产生了一个问题 就是以后for in 循环数组的时候多了一个键值对!

最后一个键值对为:function (name, value)
{
    for (var li in this) {
        if (this[li][name] == value) {
            return this[li];
        }
    }
    return false;
}


这个怎么办???

加载中
0
Shazi199
Shazi199
Object.defineProperty(Array.prototype, "search", {
  enumerable: false,
  value: function (name, value) {
            for (var li in this) {
                if (this[li][name] == value) {
                    return this[li];
                }
            }
            return false;
        };
});


Array.prototype.search = function (name, value){
    for (var li in this) {
        if (this.hasOwnProperty(li)) {
            if (this[li][name] == value) {
                return this[li];
            }
        }
    }
    return false;
};

推荐第一种

Shazi199
Shazi199
回复 @坤朋 : Array不推荐使用for in是对的,但是楼主想要解决的是for in枚举出prototype中自定义方法的问题,你的回答没有答到点子上去。假如楼主想要扩展关联数组甚至是别的对象时,还能用你的回答去解决问题吗?上来就把我批判一番是不是too young too simple了
坤朋
回复 @Shazi199 : 对Array使用 for in 就是错。
Shazi199
Shazi199
回复 @1514582970 : 看这里:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
1514582970
1514582970
回复 @Shazi199 : 问一下 这个defineProperty的第三个参数可用动作,除了set,get,value还有什么,有手册么?我在w3c上就看到了set和get我还以为就这两个呢!
1514582970
1514582970
回复 @Shazi199 : 你对了
下一页
0
hyjiacan
hyjiacan

defineProperty

找一下这个东西你就明白了

1514582970
1514582970
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty 我是从这里看的
0
1514582970
1514582970

引用来自“hyjiacan”的评论

defineProperty

找一下这个东西你就明白了

看了这么长时间,这个貌似不能解决问题啊,这个方法我大体弄明白了,但是怎么利用这个方法解决我的问题呢
hyjiacan
hyjiacan
回复 @1514582970 : 没有错哈 你自己检查自己的代码
1514582970
1514582970
回复 @hyjiacan : 请看楼下Shazi199 的回复 ,我就是在想这个东西如何传入两个变量,貌似Shazi199 大哥写错了
hyjiacan
hyjiacan
enumerable: false 配置这个属性以防止定义的属性 'search' 被枚举
0
坤朋
对于JavaScript,永远都不要对Array使用for in 遍历。
hyjiacan
hyjiacan
回复 @1514582970 : 关联数组在js中就叫做对象 ( { A: 'a', B: 'b'} )了。。
1514582970
1514582970
回复 @hyjiacan : 我是关联数组呢 对于索引未知!
hyjiacan
hyjiacan
回复 @1514582970 : 用for 循环
坤朋
你这个搜索是想怎么用的?写一个用例我看看。
1514582970
1514582970
额 哪怎么办? 如何遍历数组
0
1514582970
1514582970

引用来自“Shazi199”的评论

Object.defineProperty(Array.prototype, "search", {
  enumerable: false,
  value: function (name, value) {
            for (var li in this) {
                if (this[li][name] == value) {
                    return this[li];
                }
            }
            return false;
        };
});


Array.prototype.search = function (name, value){
    for (var li in this) {
        if (this.hasOwnProperty(li)) {
            if (this[li][name] == value) {
                return this[li];
            }
        }
    }
    return false;
};

推荐第一种

评论你的说对了还 我这个search使用来搜索数组的 要传入两个遍历 键名跟键值

这里附一个我对你的方法的测试连接

http://ttst.2xso.com/158/Test/2016/5/27/newhtml.html

在来一个正确的使用连接

http://ttst.2xso.com/158/Test/2016/5/27/ok.html


请使用浏览器开发者模式 查看


坤朋
回复 @坤朋 : Array.prototype.search = function (name, value) 中的第一个参数,name是干嘛用的?是你要找的数据中的位置吗?还是什么?
坤朋
回复 @坤朋 : 你这两个 re ,在这些数据的条件下,你希望返回的是什么值?
Shazi199
Shazi199
兄弟,你把search写成了seach
坤朋
看了你的用例,感觉你的对这个 search 的用途定义的很奇怪。 var arr = [[1,2,3],[4,5,6]]; var re= arr.search(1,5); var arr = [[1,2,3],[4,5,6]]; var re= arr.seach(2,4);
hyjiacan
hyjiacan
话说 http://ttst.2xso.com/158/Test/2016/5/27/newhtml.html 这个页面 你把 search 写成了 seach
0
坤朋
/*
 var arr = [[1,2,3],[4,5,6]];
 var  re= arr.search(1,5); // false

 var arr = [[1,2,3],[4,5,6]];
 var re= arr.search(2,4); // true
 */


// 上面是你的应用场景。
// 细看了一下你的应用场景。
// 今天是周末,不要浪费时间了。
// 根据你的应用场景,代码如下:


Array.prototype.search = function (name, value) {
    var arr = this[name - 1];

    if (Array.isArray(arr)) {
        return arr.indexOf(value) === -1 ? false : true;
    }

    return false;
};

// 兄台,您的参数名取的,也是绝了。。。



返回顶部
顶部