在这个例子中使用继承的最有效方法是什么?

时间:2012-09-10 16:43:47

标签: javascript jquery

所以我一直在搞乱一些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();
})​

然而这个问题是我们混乱了全局命名空间,每个对象都复制了功能属性,而实际上我们只想复制私有变量。

所以,我正在寻找的是比功能继承更好的方法来解决这个问题。我已经考虑过制作一个伪随机经典继承结构,我将私有和公共变量/函数分开,但是我还没有能够提出一个比函数继承更少开销的版本。

2 个答案:

答案 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;

Here's the updated fiddle

注意:或者,您可以在声明mybase时初始化this.c

相关问题