在javascript中管理此范围

在javascript中管理此范围,javascript,jquery,Javascript,Jquery,我试图让这个函数为它的“this”操作符获得正确的作用域,但是运气不好。在AssetName=function(options){code块中,我希望“this”指向类AssetName。我缺少什么?this的范围从一开始就是窗口 Assetname: function(options){ var Base = WM.Utility.GenericFilter() options = options; if (typeof Object.create !== "fun

我试图让这个函数为它的“this”操作符获得正确的作用域,但是运气不好。在
AssetName=function(options){
code块中,我希望“this”指向类
AssetName
。我缺少什么?this的范围从一开始就是
窗口

Assetname: function(options){

    var Base = WM.Utility.GenericFilter()
    options = options;

    if (typeof Object.create !== "function") { 
        // For older browsers that don't support object.create
        Object.create = function (o) {
            function F() {}
            F.prototype = o;
            return new F();
        };
    }       

    var AssetName = {};
    AssetName = function(options){
        return function(){
            var self = this;

            debugger;
            // Call the super constructor.
            Base.call(this, options);

            this.$mod.on('change', '#asset-name-quick-search', self, 
                this.search);
            this.$mod.on('click', '.close', self,  this.remove);

            this.initTypeAhead();
            this.$selectionList = this.$mod.find("#asset-name-selection-list");

            this.assetListItems = [];

            return this;    
        }(options, AssetName);

    }

    // The AssetName class extends the base GenericFilter class.
    AssetName.prototype = Object.create(Base.prototype);

    AssetName.prototype.initTypeAhead = function(){
        var options = {};
        options.source = _.pluck(this.collection, 'asset_name');
        options.items = 8;
        this.$mod.find('#asset-name-quick-search').typeahead(options);    
    };

    AssetName(options);
    return AssetName;
},
改为

AssetName = function(options){
        var aa =  function(){
            var self = this;

            debugger;
            // Call the super constructor.
            Base.call(this, options);

            this.$mod.on('change', '#asset-name-quick-search', self,  this.search);
            this.$mod.on('click', '.close', self,  this.remove);

            this.initTypeAhead();
            this.$selectionList = this.$mod.find("#asset-name-selection-list");

            this.assetListItems = [];

            return this;    
        };
        aa.call(AssetName,options);

    }
在代码中,函数
aa
称为
aa(选项);

Assetname: function(options){

    var Base = WM.Utility.GenericFilter()
    options = options;

    if (typeof Object.create !== "function") { 
        // For older browsers that don't support object.create
        Object.create = function (o) {
            function F() {}
            F.prototype = o;
            return new F();
        };
    }       

    var AssetName = {};
    AssetName = function(options){
        return function(){
            var self = this;

            debugger;
            // Call the super constructor.
            Base.call(this, options);

            this.$mod.on('change', '#asset-name-quick-search', self, 
                this.search);
            this.$mod.on('click', '.close', self,  this.remove);

            this.initTypeAhead();
            this.$selectionList = this.$mod.find("#asset-name-selection-list");

            this.assetListItems = [];

            return this;    
        }(options, AssetName);

    }

    // The AssetName class extends the base GenericFilter class.
    AssetName.prototype = Object.create(Base.prototype);

    AssetName.prototype.initTypeAhead = function(){
        var options = {};
        options.source = _.pluck(this.collection, 'asset_name');
        options.items = 8;
        this.$mod.find('#asset-name-quick-search').typeahead(options);    
    };

    AssetName(options);
    return AssetName;
},
[更新] 我用以下代码修复了这个bug:

AssetName =  function (options) {
    AssetName = function (options) {
        var aa = function () {
            alert(this);
            return this;
        };
        aa.call(this, options);
    }
    AssetName.prototype.initTypeAhead = function () {
        alert(1);
    }

    return new AssetName(options);;
};
var test = AssetName();
test.initTypeAhead();
但我建议您如何像下面这样编写代码:

AssetName =  function (options) {
    AssetName = function (options) {
            alert(this);
    }
    AssetName.prototype.initTypeAhead = function () {
        alert(1);
    }

    return  new AssetName();
};
var test =  AssetName();
test.initTypeAhead();

你可以将你的
var self=this
移出匿名返回函数。然后你可以使用just use
self

开始时的缩进让我有点困惑……为什么分配到“Base”之后的所有内容都缩进了,为什么你有标识“options=options”有吗?这让事情开始了。但是现在这指向一个只有原型值的对象,而我需要所有这些值在对象本身中,在原型之外。我缺少什么吗?