为什么在这个减少回调中使用Object.create?

时间:2015-06-12 19:40:39

标签: javascript functional-programming

因此,在处理这个精美教程的#19时,http://jhusain.github.io/learnrx/,我发现练习无需使用Object.create。 (参见注释掉的行)

1。那么创建accumMap副本有什么意义呢?除了表明它是可能的......

function() {
    var videos = [
        {
            "id": 65432445,
            "title": "The Chamber"
        },
        {
            "id": 675465,
            "title": "Fracture"
        },
        {
            "id": 70111470,
            "title": "Die Hard"
        },
        {
            "id": 654356453,
            "title": "Bad Boys"
        }
    ];

    // Expecting this output...
    // [
    //     {
    //         "65432445": "The Chamber",
    //         "675465": "Fracture",
    //         "70111470": "Die Hard",
    //         "654356453": "Bad Boys"
    //     }
    // ]
    return videos.
        reduce(function(accumulatedMap, video) {

            // Object.create() makes a fast copy of the accumulatedMap by
            // creating a new object and setting the accumulatedMap to be the
            // new object's prototype.
            // Initially the new object is empty and has no members of its own,
            // except a pointer to the object on which it was based. If an
            // attempt to find a member on the new object fails, the new object
            // silently attempts to find the member on its prototype. This
            // process continues recursively, with each object checking its
            // prototype until the member is found or we reach the first object
            // we created.
            // If we set a member value on the new object, it is stored
            // directly on that object, leaving the prototype unchanged.
            // Object.create() is perfect for functional programming because it
            // makes creating a new object with a different member value almost
            // as cheap as changing the member on the original object!

            //var copyOfAccumulatedMap = Object.create(accumulatedMap);

            //copyOfAccumulatedMap[video.id] = video.title;
            accumulatedMap[video.id] = video.title;

          //return copyOfAccumulatedMap;
            return accumulatedMap;
        },
        // Use an empty map as the initial value instead of the first item in
        // the list.
        {});
}

2如果你使用copyOfAccumulatedMap做,你最终得到一个像这样的对象

看起来很有趣,但令人费解,因为我不能在这里用这段代码做同样的事情

var fruit = { 'taste' : 3 };

var apple = Object.create(fruit);
    apple['size'] = 7;

var apple = Object.create(fruit);
    apple['hardness'] = 6;

var apple = Object.create(fruit);
    apple['weight'] = 10;

console.log(apple.taste);
console.log(apple.size);     // undefined as I would expect
console.log(apple.hardness); // undefined as I would expect
console.log(apple.weight);

那么是什么让练习中的对象拥有所有链式原型但是不允许我的苹果做同样的事情呢?

1 个答案:

答案 0 :(得分:1)

您回答了自己的问题:Object.create制作了原型链。 Object.create将所创建对象的原型对象作为参数。

var copyOfAccumulatedMap = Object.create(accumulatedMap);

旧的accumulatedMap被用作copyOfAccumulatedMap的原型。然后返回复制,下次通过accumulatedMap