创建bind生成的obj的新实例

时间:2012-03-25 14:37:33

标签: javascript class object bind

我正在使用Base obj中的外部方法绑定的ext类创建一个新类。

function Base(info) {
    var self = this;
    self.name = info.name;
    self.createNewInstance = function (data) {
        //I would like to identify the parent constructor
        // in this case, the obj containing `filter` and `find` methods
        // and use that to generate a new instance
        return new self.constructor(data);
    };
    return self;
}

var ext = {
        filter: function () {/*...*/},
        find: function () {/*...*/}
    },
    FinalClass = Base.bind(ext),
    instance1 = FinalClass({name: 'John'}),
    instance2 = instance1.createNewInstance({name: 'Mark'});

console.log(instance1); 
//--> {name: 'John', filter: [Function], find: [Function], createNewInstance: [Function]}
console.log(instance2); 
//--> {name: 'Mark'}

但正如您所见,我想在FinalClass类中创建新实例,该实例将能够使用绑定方法,而不仅仅是Base类。 因此instance2也有filterfindcreateNewInstance方法。

我会使用继承相同Base类的不同类型的类,所以只需对那里的绑定方法进行硬编码就行了,我担心:(

这可能实现吗?

提前致谢

1 个答案:

答案 0 :(得分:2)

我担心有一些关于javascript如何运作的误解。我们来分析代码:

var ext = {
        filter: function () {/*...*/},
        find: function () {/*...*/}
    },
    FinalClass = Base.bind(ext),

所以,这里有一个Base函数绑定到ext。这意味着,每次致电FinalClass时,this都会ext

    instance1 = FinalClass({name: 'John'}),

在这里,您呼叫FinalClass传递name等于'John'的对象。因为在Base中你有:

function Base(info) {
    var self = this;
    self.name = info.name;
    // ...
    return self;
}

thisextFinalClass的实例,这意味着您向{{1>添加新属性 name对象。而且我认为你不希望如此。 然后您返回ext,这意味着您将再次返回self

之后,你有:

ext

让我们来看看这个方法:

    instance2 = instance1.createNewInstance({name: 'Mark'});

由于self.createNewInstance = function (data) { return new self.constructor(data); }; 不是使用instance1运算符创建的,而是new本身,因此它的构造函数为ext,而不是Object可能是预期的。

我相信你可以找到一种更好的方法来使用原型继承和Object.create做你想做的事。但是,您应该能够使用类似于以下内容的代码获取您正在寻找的结果:

FinalClass

您还可以在function Base(info) { this.name = info.name; this.createNewInstance = function (data) { return new this.constructor(data); }; return this; } var ext = { filter: function () {/*...*/}, find: function () {/*...*/} }; function FinalClass(info) { var object = Object.create(ext); object.constructor = FinalClass; return Base.call(object, info); } var instance1 = FinalClass({name: 'John'}), instance2 = instance1.createNewInstance({name: 'Mark'}); console.log(instance1); console.log(instance2); // notice that `filter` and `find` won't probably be listed because are not "own properties", but the objects have them: console.log(instance1.filter); console.log(instance2.filter); 中编写一个实用方法,该方法可以概括一些有效的方法,因此您的代码将如下所示:

Base

希望有所帮助,如果您有疑问或我误解了您的问题,请告诉我!