【问题标题】:this keyword and protoypesthis 关键字和原型
【发布时间】:2014-02-04 01:08:36
【问题描述】:

您好,我正在尝试学习 JavaScript,而且我来自 C++ 背景,所以这一切都让我很困惑。我的代码看起来像这样

var someArray = [];
nameCompare = function(this.first,this.second) 
{
    if(first.name == second.name)
    {
        return 0;
    }
    else if(first.name < second.name)
    {
        return -1;
    }
    else
    {
        return 1;
    }
};

someArray.tempSort = function(){
    return this.sort(nameCompare);
};
var someOtherArray= Object.create(someArray);
someOtherArray.push({name: 'A', price: 3, rating: 2, distance: 2},
        {name: "B", price: 1, rating: 5, distance: 1},
        {name: 'C', price: 2, rating: 3, distance: 5},
        {name: 'D', price: 5, rating: 4, distance: 8});
console.log(someOtherArray.tempSort());

我对 this 关键字感到困惑,因为 someArray 从 someOtherArray 获取它的属性并且我想按名称排序我不知道如何从 someOtherArray 正确调用 name 属性。我理解 this 关键字引用当前对象但我米还是输了。由于某种原因,我不断收到关于缺少形式参数的错误,我可以不通过辅助函数传递 this.first 和 this.second 吗?

【问题讨论】:

  • Object.create 可能不是您想要的,即使它可能对您有用。如果要创建数组的副本,请使用someArray.slice()

标签: javascript inheritance prototype this


【解决方案1】:

您不需要将this.x 传递到您的参数中,只需像这样传递变量(下面的a 和b):

var someArray = [];
nameCompare = function (a, b) {
    if (a.name == b.name) {
        return 0;
    } else if (a.name < b.name) {
        return -1;
    } else {
        return 1;
    }
};

this 传递到函数的参数中会给您带来错误。查看关键字的MDN's 部分。

【讨论】:

    【解决方案2】:

    这是您在上面尝试做的工作版本:http://jsfiddle.net/TfM5U/

    一些注意事项:

    nameCompare = function(this.first,this.second) 这一行定义了一个函数并将其分配给nameCompare 变量。您在 () 中放入的只是您可以在该函数的上下文中使用的名称。所以这里没有理由使用this.

    这条线var someOtherArray= Object.create(someArray);。你可以在这里阅读更多关于Object.create()的信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

    【讨论】:

    • 感谢这有很大帮助,但是在 tempSort 中,一旦我返回 this.sort(nameCompare) 我会返回一个对象 Object 而不是排序数组。这是为什么?
    • 排序后的数组是一个对象。在 chrome 开发工具中,您可以检查对象并查看每个项目。您也可以尝试使用 JSON.stringify(myArray) 包装数组以将数组打印为字符串。
    • var someOtherArray= Object.create(someArray) 确实会创建一个以数组为原型的新对象。写入时,会创建一个新数组(副本),并且初始数组保持不变。如有疑问,请参阅此处:jsbin.com/OJEjAqe/1
    猜你喜欢
    • 2016-02-25
    • 2013-10-14
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    相关资源
    最近更新 更多