我正在使用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
也有filter
,find
和createNewInstance
方法。
我会使用继承相同Base
类的不同类型的类,所以只需对那里的绑定方法进行硬编码就行了,我担心:(
这可能实现吗?
提前致谢
答案 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;
}
而this
是ext
中FinalClass
的实例,这意味着您向{{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
希望有所帮助,如果您有疑问或我误解了您的问题,请告诉我!