代码之家  ›  专栏  ›  技术社区  ›  johnwards

javascript中的继承,“parent”中的变量

  •  9
  • johnwards  · 技术社区  · 14 年前

    我是第一次做OO javascript。我读过关于继承和原型的书,认为我已经破解了它。直到我发现这个小例子。

    function TestObject(data)
    {
        this.test_array = [];
        this.clone_array = [];
    
        this.dosomestuff = function()
        {
            for(var i=0; i<this.test_array.length; i++)
            {
                this.clone_array[i]=this.test_array[i];
            }
        }   
    
        this.__construct = function(data)
        {
            console.log("Testing Object Values" ,this.clone_array);
            this.test_array = data;
        };
    }
    
    TestObject2.prototype = new TestObject();
    
    function TestObject2(data)
    {
        this.__construct(data);
        this.dothings = function()
        {
            this.dosomestuff();
        }
    }
    

    如果我这样做:

    var foo = new TestObject2([1,2,3,4]);
    foo.dothings();
    var bar = new TestObject2([4,5,6]);
    bar.dothings();
    

    Testing Object Values, []
    Testing Object Values, []
    

    但它显示:

    Testing Object Values, []
    Testing Object Values, [1,2,3,4]
    

    问题当然是这个电话:

    TestObject2.prototype = new TestObject();
    

    如何使TestObject中的父变量“重置”,而不是在构造方法中手动重置它们?

    TestObject2是否有其他方法继承TestObject中的所有值/方法,并让“new”以PHP OO的方式运行?(我确信JS的做法真的很奇怪,好像我的大脑在大学里对我的服务是正确的,Java在这方面就像PHP一样工作)

    3 回复  |  直到 14 年前
        1
  •  10
  •   mbrevoort    14 年前

    基本上

    TestObject2.prototype = new TestObject(); 
    

    将TestObject的单个实例放置在TestObject2的原型链中。因此,TestObject2的任何实例都将修改TestObject中相同的单实例子代属性。如果您将另一个console.log放在TestObject的construtor中,您会注意到它只被调用一次!

    更详细的问题可以找到 here .

    您需要从TextObject2的构造函数中调用TextObject的构造函数,如下所示:

    function TestObject2(data)
    {
        TestObject.call( this, data);
        this.__construct(data);
        this.dothings = function()
        {
            this.dosomestuff();
        }
    }
    

    通过调用TestObject构造函数并在(这是)新的TestObject2对象的范围内执行它,它在TestObject2对象中创建TestObject的所有元素。

        2
  •  0
  •   fcalderan fcalderan    14 年前

    你已经试过定义 this.clone_array = []; 改成TestObject2?

    function TestObject2(data)
    {
        this.clone_array = [];
        this.__construct(data);
        this.dothings = function()
        {
            this.dosomestuff();
        }
    }
    
        3
  •  0
  •   JoshNaro    13 年前

    TestObject2.prototype = new TestObject();
    

    正在重写TestObject2的构造函数。

    尝试

    function TestObject2(data)
    {
        TestObject.call( this, data);
        this.__construct(data);
        this.dothings = function()
        {
            this.dosomestuff();
        }
    }
    
    
    TestObject2.prototype = new TestObject();
    TestObject2.prototype.constructor = TestObject2;