我找不到一个适当的例子来说明我对生活的热爱如何做到这一点,或者即使这是可能的。根据我对exmaples片段的拼凑理解,我提出了以下结构
var t = function()
{
this.nestedOne = function()
{
this.nest = function()
{
alert("here");
}
}
}
t.nestedOne.nest();
然而,这显然不起作用(显然)。如果有人能指出我正确的方向,我将不胜感激!
答案 0 :(得分:3)
只需完成:
var t = {
nestedOne: {
nest: function() {
alert('here');
}
}
};
否则您的代码没有意义。函数内部this
不引用函数本身,它引用调用函数的对象上下文。你甚至没有调用代码中的函数。
如果我说obj.func()
,则this
内的func
将为该obj
this.asd = true
。因此,分配true
会将"asd"
分配给该对象的ClassA = (function() {
function ClassA() {
}
ClassA.prototype.method1 = function() {
};
function ClassB() {
}
ClassB.prototype.method1 = function() {
};
return ClassA;
}())
属性。
如果你想做一个嵌套类,它看起来非常不同:
{{1}}
现在只有ClassA可以创建ClassB的实例。这应该与java中的嵌套类实现相同的目标。
答案 1 :(得分:2)
function t(){
function f(){
this.nest = function()
{
alert("here");
}
}
this.nestedOne = new f();
}
var myt=new t();
myt.nestedOne.nest()
修改1:
您也可以使用
new t().nestedOne.nest()
而不是
var myt=new t();
myt.nestedOne.nest()
(http://jsfiddle.net/CstUH/1/)
编辑2:
甚至更加浓缩:
function t(){
this.nestedOne = new function(){
this.nest = function(){
alert("here");
}
}
}
new t().nestedOne.nest()
答案 2 :(得分:1)
在JS函数中是素数类对象,你可以直接在代码中访问它们[即不使用反射左右]。
您在t
正文中执行的代码将在实际执行t
时执行:
t();
你写了t.nestedOne,nest()
,但t
没有nestedOne
属性 - 你应该这样做:
var t = {
nestedOne : {
nest : function()
{
alert("here");
}
}
};
t.nestedOne.nest();
我建议你去John Resig's Learning Advanced JavaScript教程旅行,这对我很有启发。
答案 3 :(得分:0)
我今天写的一个简单的回调处理程序,作为我如何进行深度嵌套的示例。如果在代码风格方面不是蜜蜂的膝盖,我很抱歉,这让我的概念更加清晰。
function test () {
this.that = this;
this.root = this;
this.jCallback = new Array(new Array()); // 2d
this.jCallbackCount = -1;
this.str = "hello";
// Callback handler...
this.command = {
that : this, // let's keep a reference to who's above us on the food chain
root : this.root, // takes us back to the main object
// add : function() { var that = this; console.log(that.that.str); },
add : function(targetFnc, newFunc) {
var that = this;
var home = that.that; // pretty much root but left in as an example of chain traversal.
var root = this.root; // useful for climbing back up the function chain
// console.log(that.that.str);
home.jCallbackCount++;
// target, addon, active
home.jCallback[home.jCallback.length] = { 'targetFunc' : targetFnc, 'newFunc' : newFunc, 'active' : true, 'id': home.jCallbackCount};
console.log('cbacklength: ' + home.jCallback.length);
console.log('added callback targetFunction:[' + targetFnc + ']');
return home.jCallbackCount; // if we want to delete this later...
},
run : function(targetFnc) {
var that = this;
var home = that.that;
console.log('running callback check for: ' + targetFnc + ' There is : ' + (home.jCallbackCount + 1) + 'in queue.');
console.log('length of callbacks is ' + home.jCallback.length);
for(i=0;i < home.jCallback.length - 1;i++)
{
console.log('checking array for a matching callback [' + targetFnc + ']...');
console.log('current item: ' + home.jCallback[i]['targetFunc'] );
if( home.jCallback[i]['targetFunc'] == targetFnc )
{
// matched!
home.jCallback[i]['newFunc']();
}
// console.log(that.that.jCallback[i].targetFunction);
}
}
};
}
test.prototype = {
say : function () {
var that = this;
console.log('inside');
// that.command('doSay');
that.command.run('doSay');
console.log(that.str);
}
} // end proto
// BEGIN TESTING **************************************************************************
// BEGIN TESTING **************************************************************************
// BEGIN TESTING **************************************************************************
var testing = new test();
testing.command.add('doSay', function () { console.log('213123123'); } );
testing.command.add('doSay', function () { console.log('12sad31'); } );
testing.command.add('doSay', function () { console.log('asdascccc'); } );
testing.say();