0

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

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

所以,我正在寻找一种比功能继承更好的方法来解决这个问题。我曾考虑过制作一个伪经典继承结构,在其中分离私有和公共变量/函数,但我无法想出一个开销低于函数继承的版本。

4

2 回答 2

1

如果要为每个对象创建一组新的私有变量,则需要从子对象调用父对象的构造函数。并且不要使用父级的实例作为子级的原型对象,而只是从父级的原型对象继承的对象。这可以通过以下方式完成Object.create

function myextended() {
    mybase.call(this); // apply the parent's constructor on the new object
    this.hi();
}

myextended.prototype = Object.create(mybase.prototype);

演示

于 2012-09-10T16:49:51.627 回答
0

如何使变量成为原型的一部分:

function mybase() {

    this.hi = function() {
        var ele = $('<div></div>');
        ele.html(this.c++);
        $('body').append(ele);
    }
}

mybase.prototype.c = 0;

这是更新的小提琴

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

于 2012-09-10T16:48:52.340 回答