js原型链函数覆盖问题

同一个原型链函数,传入不同参数,得出不同的结果,但后一个函数覆盖了前一个函数,两个函数输出相同的结果,此为排序的示例,排序优先级为age->sex->id
var arr = [

        {"name":"aa","id":1000,"sex":0,"age":28},
        {"name":"bb","id":1001,"sex":1,"age":18},
        {"name":"cc","id":1002,"sex":0,"age":18},
        {"name":"cc","id":1003,"sex":1,"age":18}
        
      ];
      
      //1.升序

function upsort(first,second,third){

return function(a,b){
    var v1 = a[first];
    var v2 = b[first];
    var res = v1 - v2;
    if(res == 0){
        upsort(first,second,third);
        var v3 = a[second];
        var v4 = b[second];
        var res2 = v3 - v4;
        return res2;
        if(res2 == 0){
            upsort(first,second,third);
            var v5 = a[third];
            var v6 = b[third];
            var res3 = v5 - v6;
            return res3;
        }
    }
    return res;
}

}

    //2.降序

function downsort(first,second,third){

return function(a,b){
    var v1 = a[first];
    var v2 = b[first];
    var res = v2 - v1;
    if(res == 0){
        downsort(first,second,third);
        var v3 = a[second];
        var v4 = b[second];
        var res2 = v4 - v3;
        return res2;
        if(res2 == 0){
            downsort(first,second,third);
            var v5 = a[third];
            var v6 = b[third];
            var res3 = v6 - v5;
            return res3;
        }
    }
    return res;
}

}

function sortPlugin(){}
sortPlugin.prototype.str = 1; //1为升序,2为降序,默认为升序
sortPlugin.prototype.sortWay = function(str = this.str){

if(str == 1){
    console.log(arr.sort(upsort("age","sex","id")));
}else if(str == 2){
    console.log(arr.sort(downsort("age","sex","id")));
}

}

var sp = new sortPlugin();
sp.sortWay();

sp2.sortWay(2);

单独运行两个函数是没问题的,不知道哪里出了问题,原型链还没有吃透

阅读 1.9k
2 个回答

这不是函数覆盖的问题,是活动对象仍处于激活状态的原因。最常见的例子是异步请求的数据先打印到控制台上,在进行一系列的操作,打印到控制台上的是操作后的结构。

你这里代码改下就可以看到效果了

if(str == 1){
    console.log(JSON.parse(JSON.stringify(arr.sort(upsort("age","sex","id")))));
}else if(str == 2){
    console.log(JSON.parse(JSON.stringify(arr.sort(downsort("age","sex","id")))));
}

另外,你两种排序的方法有一点小错误:return res2;这里应该先判断是否为0,再进行return

这里贴出排序优化处理
`var arr = [

{ "name": "aa", "id": 1000, "sex": 0, "age": 28 },
{ "name": "bb", "id": 1001, "sex": 1, "age": 18 },
{ "name": "cc", "id": 1002, "sex": 0, "age": 18 },
{ "name": "cc", "id": 1003, "sex": 1, "age": 18 }

];

1.升序
function upsort() {

var sortColumns = arguments;
 
return function (a, b) {
    if (sortColumns.length == 0) {
        return a - b;
    }

    for (var i = 0; i < sortColumns.length; i++) {
        var compareResult = a[sortColumns[i]] - b[sortColumns[i]];
        if (i == sortColumns.length - 1 || compareResult != 0) {
            return compareResult;
        }
    }
}

}

2.降序
function downsort() {

var sortColumns = arguments;

return function (a, b) {
    if (sortColumns.length == 0) {
        return b - a;
    }

    for (var i = 0; i < sortColumns.length; i++) {
        var compareResult = b[sortColumns[i]] - a[sortColumns[i]];
        if (i == sortColumns.length - 1 || compareResult != 0) {
            return compareResult;
        }
    }
}

}

function sortPlugin() { }
sortPlugin.prototype.str = 1; //1为升序,2为降序,默认为升序
sortPlugin.prototype.sortWay = function (str) {

if (str != undefined) {
    this.str = str;
}
 
if (this.str == 1) {
    console.log(JSON.stringify(arr.sort(upsort("age", "sex", "id")))); //如果不转换为JSON字符串就输出,打印到console的结果将在鼠标点击展开的时候去获取,导致第一次调用和第二次调用都显的最后一次调用的结果
} else if (this.str == 2) {
    console.log(JSON.stringify(arr.sort(downsort("age", "sex", "id"))));
}

}

var sp = new sortPlugin();
sp.sortWay(1);
sp.sortWay(2);`

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题