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

问题描述 投票:0回答:5

假设我有以下代码:

var album = new MyObject('album');

假设在构造对象时,通过 AJAX 加载了一堆仅与专辑相关的属性。是否可以创建一个

Album
类,以便稍后我可以这样做:

var anotherAlbum = new Album();

Album
构造函数会根据创建时加载的内容自动设置相册对象特有的属性
MyObject('album')

javascript dynamic class
5个回答
12
投票

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

您根本不必使用

new
运算符。您可以使用对象字面量创建一个新对象:

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

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

var mySecondObject = Object.create(myObject);

现在您可以更改

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

mySecondObject.attr1 = "Hello";

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

然后

mySecondObject
当然会拥有您在创建时赋予
myObject
的所有属性。

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


10
投票

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

您可以在处理 AJAX 响应的代码中执行类似的操作(假设 AJAX 响应提供新“类”的名称,并且它位于名为 newClassName 的变量中):

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

window[newClassName].prototype = {

  someProperty: "someValue",

  someMethod: function(a, b) {
  },

  someOtherMethod: function(x) {
  }
}

7
投票

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

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

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

1
投票

您可以使用 Douglas Crockford 的函数继承模式。代码来自 Javascript Good Parts 书

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 对象。像这样,您可以动态添加新函数和属性到现有对象


-2
投票

你可以这样做

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();
© www.soinside.com 2019 - 2024. All rights reserved.