构造函数的原型对象的属性中的方法的this如何在定义时指定为构造函数的实例对象?

var App = function(){
    this.data = [1,2,3]
}

App.prototype._method = (function(){
    return {
        getData: function(){
            return this.data;
        },
        setData: function(val){
            this.data.push(val)
        }
    
    }
    
})();

我想问一下,对于_method属性下的方法如何指定this为App的实例对象?

var app = new App();
app._method.getData.call(app);

以上是一种方法。

我想问的是:如何实现
app._method.getData(); // 直接调用,不需要写call。最好在定义这些方法时实现,不要在定义完后,再通过bind()方法实现。(当然,也不要将_method内的各个方法直接挂载在prototype)

阅读 4.4k
5 个回答
var App = function(){
    function _App_(){
        this.data = [1,2,3];
    }
    var tAPP=new _App_();
    function App1(){
    }
    App1.prototype= tAPP;
    App1.prototype._method=(function(){
        var self=tAPP;
        return {
            getData: function(){
                return self.data;
            },
            setData: function(val){
                self.data.push(val)
            }
        
        }
    })();
    
    return new App1();
}

App.prototype._method = (function(){
    var self = this;
    return {
        getData: function(){
            return self.data;
        },
        setData: function(val){
            self.data.push(val)
        }
    
    }
    
})();

this是一个叫做"上下文"的概念,函数调用时确定,想在定义的时候隔了一个"上下文"传貌似有点屌。

感觉无解兄弟,而且不能用bind(),你一个prototype上的函数bind一个实例算是几个意思。考虑其他实例的感受吗。

可以实现畸形的app._method().getData()

App.prototype._method = function () {
  var _this = this
  return {
    getData: function () {
       return _this.data
    }
  }
}

但是这样有什么用。。浪费空间,不符合prototype的用意。

还是按基本法来吧,JS内置"构造函数"的prototype上的方法不都一个个来的嘛,Array上那么多方法也不需要分类呀

不明白这样做的意图,试试这样:

App.prototype._method = function(){
    var that = this;
    return {
        getData: function(){
            return that.data;
        },
        setData: function(val){
            that.data.push(val)
        }
    }
};

调用时app._method().getData()

好奇特的要求,不过看你的 _method 命名,我猜你并不想把 _method 暴露在外。所以可以考虑在调用时做文章而不是在定义的时候。如果我不幸猜错了,那楼上已经有不少解决办法了

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