Javascript 创建绑定生成的obj的新实例
我正在基于Javascript 创建绑定生成的obj的新实例,javascript,class,object,bind,Javascript,Class,Object,Bind,我正在基于Base类创建一个新类,该类与extobj中的外部方法绑定 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 contain
Base
类创建一个新类,该类与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
类内部创建新实例,该类将能够使用绑定方法,而不仅仅是Base
类方法。
因此,instance2
还将具有filter
、find
和createNewInstance
方法
我将使用不同类型的类来继承相同的Base
类,因此在其中硬编码bind方法恐怕无法工作:(
这有可能实现吗
提前感谢我恐怕对javascript的工作原理有一些误解。让我们分析一下代码:
var ext = {
filter: function () {/*...*/},
find: function () {/*...*/}
},
FinalClass = Base.bind(ext),
因此,这里有一个绑定到ext
的Base
函数。这意味着每次调用FinalClass
,这个
将是ext
instance1 = FinalClass({name: 'John'}),
这里调用FinalClass
传递一个name
等于“John”的对象。因为在Base
中,您有:
function Base(info) {
var self = this;
self.name = info.name;
// ...
return self;
}
instance2 = instance1.createNewInstance({name: 'Mark'});
而这个
是FinalClass
中的ext
的实例,它意味着您正在向ext
对象添加一个新属性name
。我想您不希望这样。
然后返回self
,这意味着再次返回ext
在此之后,您有:
function Base(info) {
var self = this;
self.name = info.name;
// ...
return self;
}
instance2 = instance1.createNewInstance({name: 'Mark'});
让我们看看这个方法:
self.createNewInstance = function (data) {
return new self.constructor(data);
};
由于instance1
不是使用new
操作符创建的,而且它本身是ext
,这意味着它的构造函数是对象
,而不是您可能期望的最终类
我相信您可以找到一种更好的方法来使用原型继承和。但是,您应该能够使用类似于以下代码的代码来获得所需的结果:
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'});
希望能有所帮助,如果您有疑问或我误解了您的问题,请告诉我!哇,非常感谢ZER0这正是我想要的,感谢您将这个伟大的答案组合在一起