Ember.js how does reopenClass work?

前端 未结 2 925
说谎
说谎 2020-12-24 07:02

I don\'t really get the function of ember.js\' reopenClass. I thought it added extra code to the Object\'s prototype, so all instances of that Object would get the functiona

相关标签:
2条回答
  • 2020-12-24 07:50

    In general, reopen adds methods and properties to instances whereas reopenClass adds methods and properties to classes.

    The corresponding tests are ember-runtime/tests/system/object/reopen_test.js and packages/ember-runtime/tests/system/object/reopenClass_test.js.

    I've updated your code and added some comments, see http://jsfiddle.net/pangratz666/yWKBF/:

    Logger = Ember.Object.extend({
        log: function(thing) {
            console.log(thing + ' wassup');
        }
    });
    
    var logger1 = Logger.create();
    var logger2 = Logger.create();
    
    // instances of Logger have a 'wassup' method
    try { Logger.log("1, yo"); } catch (e) {} // Object (subclass of Ember.Object) has no method 'log'
    logger1.log("1, yo"); // 1, yo wassup
    logger2.log("1, yo"); // 1, yo wassup
    
    console.log('----');
    
    // overwrite log of concrete logger instance logger1
    logger1.reopen({
        log: function(name) {
            console.log(name + ' ghurt');
        }
    });
    
    try { Logger.log("1, yo"); } catch (e) {} // Object (subclass of Ember.Object) has no method 'log'
    logger1.log("2, yo"); // 2, yo ghurt
    logger2.log("2, yo"); // 2, yo wassup
    
    console.log('----');
    
    // classes of Logger have a 'fresh' method
    Logger.reopenClass({
        log: function(name) {
            console.log(name + ' fresh');
        }
    });
    
    Logger.log("3, yo"); // 3, yo fresh
    logger1.log("3, yo"); // 3, yo ghurt
    logger2.log("3, yo"); // 3, yo wassup
    
    console.log('----');
    
    // new* instances of Logger have from now on a 'dawg' method
    // * this will likely change in the future so already existing instances will reopened too
    Logger.reopen({
        log: function(name) {
            console.log(name + ' dawg');
        }
    });
    
    Logger.log("4, yo"); // 4, yo fresh
    logger1.log("4, yo"); // 4, yo ghurt
    logger2.log("4, yo"); // 4, yo wassup
    Logger.create().log("4, yo"); // 4, yo dawg
    
    console.log('----');
    

    0 讨论(0)
  • 2020-12-24 08:04

    reopen changes prototype and thus changes instances of a class

    reopenClass changes the constructor itself and thus changes the class by creating static properties and functions that are only available on the class but not on any instances of the class.

    Note that the changes introduced by reopen only take effect after calling .create()

    Code examples based on the doc:

    http://emberjs.com/api/classes/Ember.Application.html#method_reopen

    MyObject = Ember.Object.extend({
      name: 'an object'
    });
    
    o = MyObject.create();
    o.get('name'); // 'an object'
    
    MyObject.reopen({
      say: function(msg){
        console.log(msg);
      }
    })
    
    try{
        o.say("hey");
    } catch(e) {
        console.log(e); // o.say is not a function (...yet)
    }
    o2 = MyObject.create();
    o2.say("hello"); // logs "hello"
    
    o.say("goodbye"); // logs "goodbye"
    

    http://emberjs.com/api/classes/Ember.Application.html#method_reopenClass

    MyObject = Ember.Object.extend({
      name: 'an object'
    });
    
    MyObject.reopenClass({
      canBuild: false
    });
    
    MyObject.canBuild; // false
    o = MyObject.create();
    o.canBuild; // undefined
    
    0 讨论(0)
提交回复
热议问题