OOP Javascript-通过另一个公共方法从公共方法访问特权方法

OOP Javascript-通过另一个公共方法从公共方法访问特权方法,javascript,oop,Javascript,Oop,如果要将WhatToScream保留为函数,则需要调用它以使用它返回的对象: var Person = function (name, age) { this.name = name; this.age = age; } Person.prototype.scream = function () { // get function screamAge from container WhatToScream, // which is available in th

如果要将
WhatToScream
保留为函数,则需要调用它以使用它返回的对象:

var Person = function (name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.scream = function () {
    // get function screamAge from container WhatToScream,
    // which is available in the instance of the object,
    // because it was defined in the prototype
    // and then call it with thisArg being current this,
    // which is pointing to current container,
    // * which at runtime is man
    this.WhatToScream.screamAge.call(this);
}

Person.prototype.WhatToScream = {
    screamAge: function () {
        alert('I AM ' + this.age + ' YEARS OLD!!!');
    },
    screamName: function () {
        alert('MY NAME IS ' + this.name + '!!!')
    }
}

var man = new Person('Berna', 21);
man.scream();

如果要将
WhatToScream
保留为函数,则需要调用它以使用它返回的对象:

var Person = function (name, age) {
    this.name = name;
    this.age = age;
}

Person.prototype.scream = function () {
    // get function screamAge from container WhatToScream,
    // which is available in the instance of the object,
    // because it was defined in the prototype
    // and then call it with thisArg being current this,
    // which is pointing to current container,
    // * which at runtime is man
    this.WhatToScream.screamAge.call(this);
}

Person.prototype.WhatToScream = {
    screamAge: function () {
        alert('I AM ' + this.age + ' YEARS OLD!!!');
    },
    screamName: function () {
        alert('MY NAME IS ' + this.name + '!!!')
    }
}

var man = new Person('Berna', 21);
man.scream();

这里有一个更接近原始代码的重新定义:

Person.prototype.scream = function () {
    this.WhatToScream().screamAge.call(this);
}

Person.prototype.WhatToScream = function () {
    return {
        screamAge: function () { ... }, 
        screamName: function () { ... },
    }
}

这里有一个更接近原始代码的重新定义:

Person.prototype.scream = function () {
    this.WhatToScream().screamAge.call(this);
}

Person.prototype.WhatToScream = function () {
    return {
        screamAge: function () { ... }, 
        screamName: function () { ... },
    }
}


WhatToScream
是一个函数而不是对象。在任何情况下,为什么不直接将这些方法添加到原型中呢?我不能,我的代码需要将新方法处理到
WhatToScream
中。稍后,人们将添加类似于
this.screamHuh(){alert(“HUH!”)}
,并且此
screamHuh()
必须可以通过
scream
访问。
whattshream
是一个函数而不是一个对象。在任何情况下,为什么不直接将这些方法添加到原型中呢?我不能,我的代码需要将新方法处理到
WhatToScream
中。稍后,人们会添加类似
this.screamHuh(){alert(“HUH!”)}
,并且
screamHuh()
必须可以通过
scream
访问此
screamHuh()
…如果有人知道一种解决方案,可以保留
whattshream
函数,我将不胜感激。。。否则我将使用你的答案在这种情况下-使用模块模式,见更新答案的第二部分。请注意,
()
@c69在我即将提交我的帖子时,您正好更新了它。在第一次生成对象之后缓存它是一个明智的想法。@BernaMariano:是的,我缓存了。在API变得一团糟之前,我仍然会更改结构。保持当前的结构,当它变得更复杂,更难跟踪闭包和封装代码时,您最终会发现自己在每个其他函数中修复了
这个
的上下文。@SpenserJ是的,这一点很好,但它将(进一步)卷积答案,因为我们将进入“缓存失效难题”;)如果有人知道一种解决方案,能够保持
whattosryan
函数。。。否则我将使用你的答案在这种情况下-使用模块模式,见更新答案的第二部分。请注意,
()
@c69在我即将提交我的帖子时,您正好更新了它。在第一次生成对象之后缓存它是一个明智的想法。@BernaMariano:是的,我缓存了。在API变得一团糟之前,我仍然会更改结构。保持当前的结构,当它变得更复杂,更难跟踪闭包和封装代码时,您最终会发现自己在每个其他函数中修复了
这个
的上下文。@SpenserJ是的,这一点很好,但它将(进一步)卷积答案,因为我们将进入“缓存失效难题”;)@我不知道我做了什么,我再也不能让它工作了。。我正在尝试
中的方法。WhatToScream
要想获得所有尖叫的方法,我目前有2个,但它似乎没有检索到一个…@BernaMariano应该
用于(新的this.whatScream中的方法)
case@BernaMariano如果这个答案解决了你的问题,考虑一下投票和接受吧。通过单击大的绿色勾号(✔) 在答案的分数下。@c69我不知道我做了什么,我再也不能让它工作了。我正在尝试
中的方法。WhatToScream
为了获得所有尖叫的方法,我目前有2个,但它似乎没有检索到一个…@BernaMariano应该
用于(新的this.WhatToScream中的方法)
在本例中case@BernaMariano如果这个答案解决了你的问题,考虑一下投票和接受它,点击大的绿色刻度标记。✔) 在答案的分数之下。