恐怕有一些誤解有關的作品如何讓JavaScript的分析代碼:
var ext = {
filter: function() {/*...*/},
find: function() {/*...*/}
},
FinalClass = Base.bind(ext),
所以,在這裏你有一個Base
函數綁定到ext
。這意味着,每當您撥打FinalClass
時,this
將是ext
。
instance1 = FinalClass({name: 'John'}),
這裏你打電話FinalClass
傳遞對象與name
等於「約翰」。因爲在Base
您有:
function Base(info) {
var self = this;
self.name = info.name;
// ...
return self;
}
而且this
是ext
在FinalClass
的情況下,這意味着你添加新的屬性name
到ext
對象。我認爲你不想那樣。 然後您返回self
,這意味着您再次返回ext
。
之後,您有:
instance2 = instance1.createNewInstance({name: 'Mark'});
讓我們看看這個方法:
self.createNewInstance = function (data) {
return new self.constructor(data);
};
因爲instance1
它不能利用new
運營商,它的ext
本身而言,它意味着它的構造函數是Object
,而不是你所期望的FinalClass
。
我相信你可以找到一個更好的方式來做你想要的原型繼承和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'});
希望它有幫助,如果你有疑問,或者我誤解了你的問題,只是讓我知道!
非常感謝ZER0這正是我所期待的,謝謝你將這個偉大的答案放在一起 – zanona 2012-03-27 09:26:27