在尝试继承原型时,这是未定义的

时间:2016-09-13 06:37:36

标签: javascript prototype

我正在尝试动态添加原型但由于某种原因,当我尝试继承undefined时,此关键字会返回prototype。但是,当我在浏览器控制台上运行相同的代码时,它可以正为什么它不能使用Node.js?

我还在问题末尾包含了我的完整代码。

我的主要问题发生在这里:

let postObj = function(){
  this.data = post;
  this.originalIndex = i;
};

//postObj.prototype = postProto; // have same result
postObj.prototype = Object.create(postProto);

//postObj.data = post;
_self.posts.push(new postObj());

当我尝试在原型方法中访问this时,它总是返回undefined。例如,postProto有一个查找id的方法this.data._id。正如您所看到的,我已经为postObj设置了构造函数,那为什么不将它传递给原型?

请告诉我这里有什么问题。

完整代码:

const postPrototype = {
  id: (){
    return this.data._id;
  },

  title: (){
    return this.data.title;
  }
}

function fetchPosts(){
  this.posts = [];

  this.rawPosts = [
    {_id: '1', title: 'In sit amet lorem velit, in dictum lorem'},
    {_id: '2', title: 'Vestibulum ante ipsum primis in faucibu'},
    {_id: '3', title: 'Integer vulputate nibh et diam sagittis in dictum mauris dapibus'}
  ];

  this.inheritPrototype();
}

fetchPosts.prototype.inheritPrototype = function(){
  var _self = this;

  if(!_.isEmpty(_self.rawPosts)){
    _self.rawPosts.forEach(function(post, i){
      try{
        let postObj = function(){
          this.data = post;
          this.originalIndex = i;
        };

        //postObj.prototype = postProto; // have same result
        postObj.prototype = Object.create(postPrototype);

        //postObj.data = post;
        _self.posts.push(new postObj());

      }catch(err){
        console.log(err);
      }
    });
  }

};

fetchPosts.prototype.get = function(){
  return this.posts;
}


var sampleFetch = new fetchPosts();
sampleFetch.get().forEach(function(post, i){
  post.id(); // This return error: cannot get property _id undefined
});

1 个答案:

答案 0 :(得分:0)

首先,由于try catch阻止,您隐藏了错误:"ReferenceError: postProto is not defined"。在脚本的顶部,您已定义postPrototype变量,但您使用了postProto,这当然是未定义的。

此外,在postPrototype的声明中,您使用了对象字面速记但不正确。您应该在没有:的情况下使用它。

const postPrototype = {
  id (){
    return this.data._id;
  },

  title (){
    return this.data.title;
  }
}

我已编辑了您的代码here