javascript - 创建绑定(bind)生成的对象的新实例

标签 javascript class object bind

我正在创建一个基于 Base 类的新类,该类绑定(bind)了来自 ext obj 的外部方法。

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 类内部创建新实例,它将能够使用绑定(bind)方法,而不仅仅是 Base 类方法. 所以 instance2 也会有 filterfindcreateNewInstance 方法。

我会使用继承相同 Base 类的不同类型的类,所以恐怕只是硬编码其中的绑定(bind)方法是行不通的 :(

这有可能实现吗?

提前致谢

最佳答案

恐怕对 javascript 的工作原理存在一些误解。我们来分析一下代码:

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

所以,这里有一个绑定(bind)到 extBase 函数。这意味着,每次调用 FinalClass 时,this 都将是 ext

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

此处调用 FinalClass 并传递一个 name 等于“John”的对象。因为在 Base 中你有:

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

thisFinalClassext 的实例,这意味着您要添加一个新属性 nameext 对象。我认为你不想要那个。 然后你返回self,这意味着你再次返回ext

在那之后,你有:

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

让我们看一下该方法:

self.createNewInstance = function (data) {
    return new self.constructor(data);
};

因为 instance1 它不是使用 new 运算符创建的,而是 ext 本身,这意味着它的构造函数是 Object,而不是您可能期望的 FinalClass

我相信您可以使用原型(prototype)继承和 Object.create 找到更好的方法来完成您想要的事情.但是,您应该能够使用类似于以下的代码获得您正在寻找的结果:

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 中编写一个实用方法来泛化一些有效的代码,因此您的代码将如下所示:

function Base(info) {
    this.name = info.name;

    this.createNewInstance = function (data) {
        return new this.constructor(data);
    };

    return this;
}

Base.create = function(extension) {
    return function Extendend () {
        var object = Object.create(extension);
        object.constructor = Extendend;

        return Base.apply(object, arguments);
    }
}

var ext = {
        filter: function () {/*...*/},
        find: function () {/*...*/}
    };

var FinalClass = Base.create(ext);

var instance1 = FinalClass({name: 'John'}),
    instance2 = instance1.createNewInstance({name: 'Mark'});

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

关于javascript - 创建绑定(bind)生成的对象的新实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9860999/

相关文章:

java - 如何从 Java 中的另一个类获取类的特定实例?

c++ - 作为表达式的模板参数语法

javascript - javascript 中构造函数中的构造函数?

java - 有没有办法使用传递的类对象的方法?

javascript - 如何使我的 JavaScript 代码在开发者控制台中不可读?

javascript - 使用 jquery 动画方向

javascript - 使用 JS 更改计时器上的所有图像

javascript - 使用 HTTP POST 的 AWS S3 浏览器上传提供无效签名

php - 根据单击的内容自定义消息

javascript - 如何将 Javascript "partial classes"与 TypeScript 样式类定义一起使用