检查对象是否准备好使用javascript

检查对象是否准备好使用javascript,javascript,jquery,Javascript,Jquery,我有一个javascript对象: var Car = { data: { "wheels": 4, "colour": "red", }, changeColour: function(colour){ Car.coulour = colour; }, } 我需要实现以下功能: var car_obj = Car || {} car_obj.isReady = function(){ car_obj.ch

我有一个javascript对象:

var Car = {
    data: {
        "wheels": 4,
        "colour": "red",
    },
    changeColour: function(colour){
        Car.coulour = colour;
    },
}
我需要实现以下功能:

var car_obj = Car || {}
car_obj.isReady = function(){
    car_obj.changeColour("blue");
};

isReady
应该等到对象准备好使用,然后对对象进行一些操作。如何实现此功能?

您可以做两件事:

var Car = {
    data: {
        "wheels": 4,
        "colour": "red"
    },
    changeColour: function(colour){
        Car.data.colour = colour; // <----should be changed to Car.data.colour
    } // <---- , not required.
}

使用
Object.observe()
可以执行以下操作:

Object.observe(Car, function(changes){

    // This asynchronous callback runs
    changes.forEach(function(change) {
        console.log(change); // log the changes.
    });

});

CAR
一个构造函数包装:

function Car(data) {
    //Build base
    var Car = {
        data : {
            "wheels" : 4,
            "colour" : "red",
        },
        changeColour : function (colour) {
            Car.data.colour = colour;
        }
    }
    //Parse inputs
    if (typeof data === 'object') {
        if (typeof data['colour'] !== 'undefined') {
            Car.changeColour(data['colour']);
        }
    }
    //Return object
    return Car;
};

var car = new Car({
    colour : 'blue'
});
console.log(car);

这样,在您尝试分配任何内容之前,您可以确定对象已完成“构建”。

这种异步代码是通过两种不同的方式在JavaScript中完成的:

  • 回调
  • 许诺
  • 回调 此解决方案涉及将函数传递给对象构造函数,当对象准备就绪时,将从构造函数的代码调用该函数:

    var Car = function(ready) {
       var self = this;
       self.data = { /* ... */ };
       self.changeColour = { /* ... */ };
       // invoke ready, when the object is read:
          ready();
       return self;
    }
    
    var runWhenCarReady = function() { /* */ }
    var car = new Car(runWhenReady);
    
    承诺 您的构造函数应该返回一个承诺,该承诺将在构造函数完成其工作后得到解决

    var Car = function() {
        var deferred = $.Deferred(); // jQuery promises implementation
        // ...
        // when ready run this code to return the value wrapped in the promise:
             deferred.resolve(self.this);
        // ...
        return deferred.promise;
    };
    
    使用构造函数的代码应执行以下操作:

    var promise = Car().then(function(car) {
        // car is available here
    }
    
    涉及对象轮询的解决方案不是一个好主意,因为它们会阻塞网页

    您可以在
    jQuery.Deferred
    或中阅读有关承诺的内容,或者在web上搜索“JavaScript承诺”

    最后说明 这仅在涉及异步代码时才有必要。否则,JavaScript“按顺序运行”,因此您可以保证在一行代码中创建的内容在下一行代码中可用。我想你过分简化了你的样品


    JavaScript异步性最常见的情况是AJAX调用。对于jQuery,他们使用promise模式。

    这类似于“可观察”的设计模式。你应该看看KnockoutJS=>@ADreNaLiNe DJ我只需要使用jQuery或纯javascript。是什么让这个对象可以使用?没有足够的信息提供它应该这样工作:当创建
    Car
    对象的实例并准备好使用时,应该调用
    isReady
    函数中的所有内容,以防止类型错误:调用未定义。
    Car
    是一个对象,不能创建对象的实例。您可以使用
    Object.create
    从对象派生新对象。也就是说,“功能描述”创建了一个对
    汽车的引用副本,或者如果它不存在,则创建一个新的空对象。在后一种情况下,
    car\u obj.isReady()
    将始终失败。它可以工作,但有没有办法在没有
    car\u obj.isReady()的情况下自动调用此函数?如果不创建我的
    Car`对象实例,会发生错误吗?函数应该等到对象被创建。将不会创建汽车对象。是否会发生错误?当然,但是如果你想访问它的属性,你必须创建一个对象,这就是为什么你有这个
    var car_obj=car |{}
    ,现在你可以自动使用观察者了。我可以看到,所以没有办法像我想的那样使用它:
    car_obj.isReady=…
    没有
    observe
    等等?我认为你对此无能为力,但是
    observators
    产生了巨大的影响,大多数前端mv*框架使用它进行双向数据绑定,以查找更改和更新。但是,我会说更多的,也许这会帮助你理解我想要实现的目标。因此,我在这个
    Car
    对象中有一些方法,这些方法从
    localStorage
    加载数据,例如,它加载
    颜色、车轮等
    ,我想对这个对象数据进行一些操作,即获取汽车模型。当我使用
    nanobay.getModel()时它返回null,因为它的对象尚未加载数据,但当我在
    $(document.ready(function(){})中使用它时它将显示数据。这就是我想要等待的,直到对象加载所有数据,然后对其进行一些操作。我能做到吗?
    
    var promise = Car().then(function(car) {
        // car is available here
    }