在继承的函数

时间:2018-02-23 16:22:41

标签: javascript object inheritance

我无法弄清楚这里发生了什么。 我知道你必须时不时地将“this”绑定到一个函数来访问它

myclass: {
    test: function(){
        console.log(this.property);
    }.bind(this);
}

我有两个对象fatherchild,我将其扩展为合并所有属性。我将$ .extend与“true”一起使用,以获得深层副本并使用全新的对象以便不修改原始对象。

var father = {

    mydata: {
        age: 49
    },

    mymethods: {
        showMyAge: function() {
            console.log(this.mydata.age);
        }
    }
};

var child = {
};

var obj = $.extend(true, {}, father, child);

obj.mymethods.showMyAge();

输出

Uncaught TypeError: Cannot read property 'age' of undefined

好的,我说。这是绑定(这个)的事情。非常简单。 所以,我试图添加bind(this)

var father = {

     /*...*/

    mymethods: {
        showMyAge: function() {
            console.log(this.mydata.age);
        }.bind(this)
    }
};

再次

Uncaught TypeError: Cannot read property 'age' of undefined

我试过

obj.mymethods.showMyAge().bind(obj);

同样的错误。 然后我发现如果我把父亲的方法平放到一个级别就行了!

var father = {

    /*...*/

    mymethods: {
        /* moved showMyAge method from here ... */
    }

    /* to here */
    showMyAge: function() {
        console.log(this.mydata.age);
    }
};

输出正确

49

为什么会这样?当然,这对我来说不是一个解决方案,因为我有一个非常复杂的对象,包含子对象,包含方法。

提前谢谢。

2 个答案:

答案 0 :(得分:0)

使用这种方式: obj.mymethods.showMyAge.call(obj);obj.mymethods.showMyAge.apply(obj);

apply将参数用作数组:yourFunction.apply(valueForThis, arrayOfArgs);

call需要列出参数:yourFunction.call(valueForThis, arg1, arg2, ...,argN);

答案 1 :(得分:0)

将对象包裹在IIFE(立即调用的函数表达式)中。这会在闭包中创建一个私有变量(that)。然后,您可以将that称为父对象。

var father = (function() {
  var that = {
    mydata: {
        age: 49
    },

    mymethods: {
        showMyAge: function() {
            console.log(that.mydata.age);
        }
    }
  };
  return that;
})();