Javascript:嵌套(内部)类型的首选设计是什么?

发布于 2024-08-15 10:45:20 字数 1309 浏览 3 评论 0原文

我对构造函数使用 Resig 的 makeClass() 方法:

// makeClass - By John Resig (MIT Licensed)
// Allows either new User() or User() to be employed for construction. 
function makeClass(){
  return function(args){
    if ( this instanceof arguments.callee ) {
      if ( typeof this.init == "function" )
          this.init.apply( this, (args && args.callee) ? args : arguments );
    } else
      return new arguments.callee( arguments );
  };
}

// usage:
// ------
// class implementer:
//   var MyType = makeClass();
//   MyType.prototype.init = function(a,b,c) {/* ... */};
// ------
// class user:
//   var instance = new MyType("cats", 17, "September");
//      -or-
//   var instance = MyType("cats", 17, "September");
//



var MyType = makeClass();

MyType.prototype.init = function(a,b,c) {
    say("MyType init: hello");
};

MyType.prototype.Method1 = function() {
    say("MyType.Method1: hello");
};

MyType.prototype.Subtype1 = makeClass();

MyType.prototype.Subtype1.prototype.init = function(name) {
    say("MyType.Subtype1.init:  (" + name + ")");
}

在该代码中,MyType() 是顶级类型,MyType.Subtype1 是嵌套类型。

要使用它,我可以这样做:

var x = new MyType(); 
x.Method1();
var y = new x.Subtype1("y"); 

我可以在 Subtype1() 的 init() 中获取对父类型实例的引用吗? 如何?

I use Resig's makeClass() approach for constructors:

// makeClass - By John Resig (MIT Licensed)
// Allows either new User() or User() to be employed for construction. 
function makeClass(){
  return function(args){
    if ( this instanceof arguments.callee ) {
      if ( typeof this.init == "function" )
          this.init.apply( this, (args && args.callee) ? args : arguments );
    } else
      return new arguments.callee( arguments );
  };
}

// usage:
// ------
// class implementer:
//   var MyType = makeClass();
//   MyType.prototype.init = function(a,b,c) {/* ... */};
// ------
// class user:
//   var instance = new MyType("cats", 17, "September");
//      -or-
//   var instance = MyType("cats", 17, "September");
//



var MyType = makeClass();

MyType.prototype.init = function(a,b,c) {
    say("MyType init: hello");
};

MyType.prototype.Method1 = function() {
    say("MyType.Method1: hello");
};

MyType.prototype.Subtype1 = makeClass();

MyType.prototype.Subtype1.prototype.init = function(name) {
    say("MyType.Subtype1.init:  (" + name + ")");
}

In that code, MyType() is a toplevel type, and MyType.Subtype1 is a nested type.

To use it, I can do:

var x = new MyType(); 
x.Method1();
var y = new x.Subtype1("y"); 

Can I get a reference to the instance of the parent type, within the init() for Subtype1() ?
How?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

浮萍、无处依 2024-08-22 10:45:21

不,除非你编写一个明确跟踪这个“外部”类的类实现,否则 Javascript 将无法将其提供给你。

例如:

function Class(def) {
    var rv = function(args) {
        for(var key in def) {
            if(typeof def[key] == "function" && typeof def[key].__isClassDefinition == "boolean")
                def[key].prototype.outer = this;
            this[key] = def[key];
        }

        if(typeof this.init == "function")
            this.init.apply( this, (args && args.callee) ? args : arguments );  
    };

    rv.prototype.outer = null;
    rv.__isClassDefinition = true;
    return rv;
}

var MyType = new Class({
    init: function(a) {
        say("MyType init: " + a);
        say(this.outer);
    },

    Method1: function() {
        say("MyType.Method1");
    },

    Subtype1: new Class({
        init: function(b) {
            say("Subtype1: " + b);
        },

        Method1: function() {
            say("Subtype1.Method1");
            this.outer.Method1();
        }
    })
});

var m = new MyType("test");
m.Method1();

var sub = new m.Subtype1("cheese");
sub.Method1();

Nope, not unless you write a class implementation that tracks this "outer" class explicitly, Javascript won't be able to give this to you.

For example:

function Class(def) {
    var rv = function(args) {
        for(var key in def) {
            if(typeof def[key] == "function" && typeof def[key].__isClassDefinition == "boolean")
                def[key].prototype.outer = this;
            this[key] = def[key];
        }

        if(typeof this.init == "function")
            this.init.apply( this, (args && args.callee) ? args : arguments );  
    };

    rv.prototype.outer = null;
    rv.__isClassDefinition = true;
    return rv;
}

var MyType = new Class({
    init: function(a) {
        say("MyType init: " + a);
        say(this.outer);
    },

    Method1: function() {
        say("MyType.Method1");
    },

    Subtype1: new Class({
        init: function(b) {
            say("Subtype1: " + b);
        },

        Method1: function() {
            say("Subtype1.Method1");
            this.outer.Method1();
        }
    })
});

var m = new MyType("test");
m.Method1();

var sub = new m.Subtype1("cheese");
sub.Method1();
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文