2010-02-26 42 views
5

创建一个新的JavaScript类说我有以下代码:动态地从现有对象

var album = new MyObject('album'); 

假设对象被构造时,一串相对于仅相册属性都通过AJAX加载。是否有可能创建一个Album类,以便在以后,我可能只是这样做:

var anotherAlbum = new Album(); 

Album构造会自动将基于什么时候装特有的专辑对象的属性,创建MyObject('album')

回答

2

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

你会做的代码处理Ajax响应是这样的(假设AJAX响应提供了新的“类”的名称,这是在一个名为newClassName变量):

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

window[newClassName].prototype = { 

    someProperty: "someValue", 

    someMethod: function(a, b) { 
    }, 

    someOtherMethod: function(x) { 
    } 
} 
+0

我的主要问题是,你如何创建“相册”对象,使之能在应用程序的任何一点被调用 – 2010-02-26 15:19:09

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(); 
8

JavaScript是原型的,而不是传统的,所以如果你想在类的术语,你这样做是错误的。

根本不需要使用new运算符。

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

然后,您可以创建一个对象的新实例:您可以使用对象文本创建一个新的对象

var mySecondObject = Object.create(myObject); 

现在你可以改变的mySecondObject的属性,如果有方法你可以很容易地重载它们:

mySecondObject.attr1 = "Hello"; 

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

然后mySecondObject当然会说你℃具myObject的所有属性reation。

请注意,这是一个简单的版本,并且这会将所有属性“公开”。如果你需要一些隐私,可以通过添加一些功能来实现。这有点复杂,所以让我知道你是否感兴趣...

1

你可以使用Douglas Crockford的功能继承模式。来自Javascript的代码良好的零件书

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对象具有新的功能和属性。这样你可以在飞行中增加新的功能和属性,以现有的对象

-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(); 
+1

我不明白这是如何回答这个5岁的问题。 – 2015-06-29 06:01:54