从现有对象动态创建新的javascript类

时间:2010-02-26 15:03:11

标签: javascript dynamic class

说我有以下代码:

var album = new MyObject('album');

假设在构造对象时,通过AJAX加载了一组仅与专辑相关的属性。是否可以创建一个Album类,以便稍后我可以这样做:

var anotherAlbum = new Album();

Album构造函数会根据创建MyObject('album')

时加载的内容自动设置相册对象的唯一属性

5 个答案:

答案 0 :(得分:9)

JavaScript是原型的,不是经典的,所以如果你从类的角度思考,那你做错了。

您根本不必使用new运算符。您可以使用对象文字创建新对象:

var myObject = {attr1: 'val1', attr2: 'val2'};

然后您可以创建该对象的新实例:

var mySecondObject = Object.create(myObject);

现在您可以更改mySecondObject的属性,如果它有方法,您可以轻松地重载它们:

mySecondObject.attr1 = "Hello";

mySecondObject.attr2 = function() {
                           return "World!";
                       };

然后mySecondObject当然会包含您在创建时提供的所有属性{。}}。

请注意,这是一个简单版本,这会使所有属性“公开”。如果您需要一些隐私,可以通过添加一些功能来实现。这有点复杂,所以如果你有兴趣,请告诉我......

答案 1 :(得分:4)

可以动态创建JavaScript“类”,就像任何其他对象一样。所以,是的,这可以做到。

你会在处理AJAX响应的代码中做这样的事情(假设AJAX响应提供了新“class”的名称,并且它在一个名为newClassName的变量中):

window[newClassName] = function() {
  // New class name constructor code
}

window[newClassName].prototype = {

  someProperty: "someValue",

  someMethod: function(a, b) {
  },

  someOtherMethod: function(x) {
  }
}

答案 2 :(得分:3)

这实际上是JavaScript所拥有的唯一继承。 JavaScript有prototypal inheritance(可用于重新创建经典继承)。这意味着继承来自另一个对象,而不是类定义。

创建一个具有另一个对象的所有属性的对象很简单:

function Album() {
   // do whatever initialization you need to here, all the properties of album 
   // are available on 'this'
   // e.g.,
   doSomething(this.albumName);
}
Album.prototype = album;

var anotherAlbum = new Album();

答案 3 :(得分:1)

你可以使用Douglas Crockford的功能继承模式。来自Javascript Good Parts book的代码

var mammal = function (spec) {
    var that = {};

    that.get_name = function (  ) {
        return spec.name;
    };

    that.says = function (  ) {
        return spec.saying || '';
    };

    return that;
};

var myMammal = mammal({name: 'Herb'});


var cat = function (spec) {
    spec.saying = spec.saying || 'meow';
    var that = mammal(spec);
    that.purr = function (n) {
        var i, s = '';
        for (i = 0; i < n; i += 1) {
            if (s) {
                s += '-';
            }
            s += 'r';
        }
        return s;
    };
    that.get_name = function (  ) {
        return that.says(  ) + ' ' + spec.name +
                ' ' + that.says(  );
    return that;
};

var myCat = cat({name: 'Henrietta'});

它使用函数来装饰具有新功能和属性的现有javascript对象。像这样,您可以动态地将新功能和属性添加到现有对象

答案 4 :(得分:-1)

你可以这样做

var NewClass=function(){
    this.id=null;
    this.name=null;
    this.show=function(){
        alert(this.id+" "+this.name;
    }
}
NewClass.prototype.clear=function(){
    this.id=null;
    this.name=null;
};

...

var ins1=new NewClass();
var ins2=new NewClass();