正在向构造函数添加作用域变量

Adding scope variable to a constructor

本文关键字:作用域 变量 添加 构造函数      更新时间:2023-09-26

我正试图在javascript上创建一个类似类的体系结构,但有一点停滞不前。这是代码:

var make = function(args) {
    var priv = args.priv,
        cons = args.cons,
        pub = args.pub;
    return function(consParams) {
        var priv = priv,
            cons = args.cons;
        cons.prototype.constructor = cons;
        cons.prototype = $.extend({}, pub);
        if (!$.isFunction(cons)) {
            throw new Hata(100001);
        }
        return new cons(consParams);
    }
};

我试图在返回的函数对象的作用域和cons.prototype的对象作用域上添加priva变量,但我做不到;

以下是make对象的用法:

var myClass = make({
    cons: function() {
        alert(this.acik);
        alert(priv.gizli);
    },
    pub: {
        acik: 'acik'
    },
    priv: {
        gizli: 'gizli'
    }
})
myObj = myClass();

PS:我已经使用了外部变量来演示我想做什么。我知道javascript函数结构的私有变量语法。但我需要一个解决方案来更改(添加私有变量)将由"新"(我忘记了模式名称)实例化模式使用的函数的范围。

附言:请原谅我的英语。。。

如果你追求类结构,你真的应该遵循以下模式:

function MyClass(arg){};

重要提示:当您将内部闭包的var名称设置为与包含外部闭包的名称相同时,您将无法再访问具有相同名称的原始外部闭包var。

另一方面,如果您需要访问外部闭包vars,则无需设置具有相同名称的内部闭包vars。只需使用vars,就好像它们在内部闭合中一样。

var make = function(args) {
    var priv = args.priv,
        cons = args.cons,
        pub = args.pub;
    return function(consParams) {
        var someThing = priv,
            sElse     = args.cons;
    }
};

//如果您需要将var或私有变量添加到名称为cons的函数对象中:如下所示,只需像添加其他函数对象一样添加即可。

var myClass = make({
    cons: function() {
         var myPrivateVariable = 'private';
        alert(this.acik);
        alert(priv.gizli);
    },
    pub: {
        acik: 'acik'
    },
    priv: {
        gizli: 'gizli'
    }
})
myObj = myClass();

如果您试图复制类结构,Javascript中的常见方法如下:

//Constructor
function MyClass(myParam){
  this.myParam = myParam
}
MyClass.prototype.myMethod = function(){
  alert(this.myParam);  //retreives the "class" instance variable myParam
}
//Instantiation
var firstMyClass = new MyClass(7);
firstMyClass.myMethod(); //alerts 7

请注意,在添加到原型的函数中,这将是对MyClass实例的引用。如果你想制作私人变量,你可以从Javascript专家Douglas Crockford那里查看这个链接:http://javascript.crockford.com/private.html