Các đối tượng JavaScript có thành viên 'nguyên mẫu' để tạo điều kiện kế thừa. Nhưng có vẻ như, chúng ta có thể sống hoàn toàn tốt, ngay cả khi không có nó, và tôi tự hỏi, những lợi ích của việc sử dụng nó là gì. Tôi tự hỏi những ưu và nhược điểm là gì.Tại sao nên sử dụng 'nguyên mẫu' cho kế thừa javascript?
Ví dụ, hãy xem xét những điều sau đây (ở đây jsfiddle):
function Base (name) {
this.name = name;
this.modules = [];
return this;
}
Base.prototype =
{
initModule: function() {
// init on all the modules.
for (var i = 0; i < this.modules.length; i++)
this.modules[i].initModule();
console.log("base initModule");
}
};
function Derived(name) {
Base.call(this,name); // call base constructor with Derived context
}
Derived.prototype = Object.create(Base.prototype);
Derived.prototype.initModule = function() {
console.log("d init module");
// calling base class functionality
Base.prototype.initModule.call(this);
}
var derived = new Derived("dname");
console.log(derived.name);
derived.initModule();
Một câu hỏi là, tại sao sử dụng 'mẫu' ở tất cả? Chúng tôi cũng có thể làm điều gì đó như Derived = Object.create(Base);
ví dụ (jsfiddle):
Base =
{
initModule: function() {
// init on all the modules.
for (var i = 0; i < this.modules.length; i++)
this.modules[i].initModule();
console.log("base initModule",this.name);
},
init: function(name) {
this.name = name;
this.modules = [];
}
};
Derived = Object.create(Base);
Derived.initModule = function() {
console.log("d init module");
// calling base class functionality
Base.initModule.call(this);
}
Derived.init("dname");
console.log(Derived.name);
Derived.initModule();
Một chuyên gia là tốc độ: http://jsperf.com/prototype-vs-non-prototype/11 – StuR
nếu bạn có 4 cấp độ thừa kế? bạn sẽ khai báo một phương thức newnewnewInitModule? – mpm
@mpm bạn đúng, là một sai lầm, tôi chỉnh sửa này đi – Lior