从另一个属性引用js属性的正确方法

时间:2014-09-06 17:04:42

标签: javascript angularjs

我正在开展一个角度项目,我有一个工厂提供一些全局数据库方法。我在一个jsfiddle中测试了它并且它可以工作,但我想知道它是否是正确的方法。

所以这里是jsFiddle

function DB () {
return {
    newRecord: function () {
         //create new record
        var id = 3;
        //this is the part I am wondering about
        //is it ok to use this in this way??
        this.setCurrentRecordId(id);
    },

    setCurrentRecordId: function (id) {
        alert('setting id');
         return localStorage.setItem('id', id);  
    },

    getCurrentRecordId: function () {
        return localStorage.getItem('id');
    }
}
}

var dbStuff = new DB();

dbStuff.newRecord();

alert(dbStuff.getCurrentRecordId());
像我说的那样,它似乎在起作用;只是想知道是否有更好的方法。

谢谢!

2 个答案:

答案 0 :(得分:1)

在JavaScript中使用 constructor functions 的“标准”方式如下:

function DB () {
    this.newRecord = function () {
        var id = 3;
        // yes, since you invoked the DB constructor using
        // using the new keyword, this will be pointing to
        // the created instance
        this.setCurrentRecordId(id);
    };

    this.setCurrentRecordId = function (id) {
        alert('setting id');
        return localStorage.setItem('id', id);  
    };

    this.getCurrentRecordId = function () {
        return localStorage.getItem('id');
    };
}

var dbStuff = new DB();

dbStuff.newRecord();

alert(dbStuff.getCurrentRecordId());

如果您需要在回调或其他上下文丢失的情况下引用该实例,则有两种常见的模式可以解决此问题。

要么存储对此的引用(被某些人视为“丑陋”,但非常方便):

function Ctor(){
    var self = this;
    this.getSomething = function(id){
        asyncThing(id).then(function(result){
            // here, `this` will refer to the global object
            self.doSomethingWith(result);
        });
    };
    this.doSomethingWith = function(result){
        // do something
    };
}

或使用 .bind() 创建具有预定义上下文的新功能:

function Ctor(){
    this.getSomething = function(id){

       var processResult = function(arg){
           this.doSomethingWith(arg);
       }.bind(this); // bind sets the function's context no matter where you'll use it

        asyncThing(id).then(processResult);
    };
    this.doSomethingWith = function(result){
        // do something
    };
}

答案 1 :(得分:0)

由于您使用的是localstorage,因此没有任何问题。

function DB () {
return {

    setCurrentRecordId: function (id) {
        alert('setting id');
         return localStorage.setItem('id', id);  
    },

    getCurrentRecordId: function () {
        return localStorage.getItem('id');
    }
}
}

var dbstuff = new DB();

dbstuff.setCurrentRecordId(3);
dbstuff.getCurrentRecordId() // 3