在嵌套的Prototype子对象中使用'this'

时间:2015-03-02 02:34:29

标签: javascript prototype

我有一个类,并为其原型提供了几个子对象以方便命名空间。这些子对象有方法。我无法弄清楚如何在这些方法中使用this来访问使用构造函数设置的属性。

我有一种感觉bindcallapply以某种方式参与其中,但我很难理解那些做什么,以及所有这些OOP- ness工作一般。有很多资源,但它们都是太低级别,或者高级别我不理解它们。谢谢!

function Object(
    argument1,
    argument2
){
    this.property1  = argument1;
    this.property2  = argument2;
}

Object.prototype    = {
    subObject1  : {
        method1 : function(){
            return this.property1;
        }
    },
    subObject2  : {
        method1 : function(){
            return this.property2;
        }
    }
}

var foo = new Object(11, 22);
var bar = new Object(33, 44);

console.log(foo.subObject1.method1()); //I'd like this to return 11
console.log(foo.subObject2.method1()); //I'd like this to return 22

console.log(bar.subObject1.method1()); //I'd like this to return 33
console.log(bar.subObject2.method1()); //I'd like this to return 44

1 个答案:

答案 0 :(得分:5)

每当您拨打foo.bar()表单时,this内的bar都会引用foo除非您将函数绑定到.bind的特定值,或使用ES6中的新“箭头”函数。

因此,一种解决方案可能是将方法绑定到特定实例。但是,在调用构造函数之前,实例不存在。这意味着你必须在构造函数中创建subObjectX

function MyObject(argument1, argument2) {
    this.property1  = argument1;
    this.property2  = argument2;

    this.subObject1 = {
        method1: function(){
             return this.property1;
        }.bind(this)
    };

    this.subObject2 = {
        method1: function(){
            return this.property2;
        }.bind(this)
    };
}

或使用新的ES6箭头功能;它们从创建它们的上下文中获取this(与普通函数不同):

// ES6 only!
function MyObject(argument1, argument2) {
    this.property1  = argument1;
    this.property2  = argument2;

    this.subObject1 = {
        method1: () => {
             return this.property1;
        }
    };

    this.subObject2 = {
        method1: () => {
            return this.property2;
        }
    };
}

这意味着每个实例都有自己的子对象副本。

如果你想在原型上定义方法,你总是必须通过.call.apply传递接收器:

foo.subObject1.method1.call(foo);

在这种情况下,将它分配给原型没什么好处,你可以只使用一个接受对象的简单函数(method1(foo))。