所以我一直在搞乱一些JavaScript继承技术,这是我试图推导出一个强大的解决方案的一个案例。
这是一个简单的例子: http://jsfiddle.net/JgrYu/
问题:从逻辑上讲,我们希望这两个div都是0。但由于我们只是在修改扩展类,所以我们不会重新生成“c”变量。
可能的解决方法是使用功能继承: http://jsfiddle.net/h8xtz/
function mybase() {
var that = {};
var c = 0;
that.hi = function() {
var ele = $('<div></div>');
ele.html(c++);
$('body').append(ele);
}
return that;
}
function myextended() {
var that = mybase();
that.hi();
return that;
}
myextended.prototype = new mybase();
$(document).ready(function() {
var a = myextended();
var b = myextended();
})
然而这个问题是我们混乱了全局命名空间,每个对象都复制了功能属性,而实际上我们只想复制私有变量。
所以,我正在寻找的是比功能继承更好的方法来解决这个问题。我已经考虑过制作一个伪随机经典继承结构,我将私有和公共变量/函数分开,但是我还没有能够提出一个比函数继承更少开销的版本。
答案 0 :(得分:1)
如果要为每个对象创建一组新的私有变量,则需要call来自子对象的父进程构造函数。并且不要使用父实例作为子项的原型对象,而只是使用从父项原型对象继承的对象。这可以通过Object.create
:
function myextended() {
mybase.call(this); // apply the parent's constructor on the new object
this.hi();
}
myextended.prototype = Object.create(mybase.prototype);
(Demo)
答案 1 :(得分:0)
如何将变量作为原型的一部分:
function mybase() {
this.hi = function() {
var ele = $('<div></div>');
ele.html(this.c++);
$('body').append(ele);
}
}
mybase.prototype.c = 0;
注意:或者,您可以在声明mybase时初始化this.c
。