javascript协构造函数的细节

javascript协构造函数的细节,javascript,oop,Javascript,Oop,假设我有一个纯构造函数(只包含这个.Bar=Bar) 1) 当我从另一个函数调用它时,我可以在调用时直接传递调用方函数的参数,还是必须执行var myBar=new bar,myBar.bar=thebar,其中bar是调用方参数 2) 即使构造函数没有得到所有参数,它还会实例化吗 3) 我如何检查其中一个参数是否唯一,即对象的其他实例对于所讨论的属性没有此值?具体来说,我想在创建时为每个对象指定一个唯一的索引。也许是阵列 非常感谢 当我从另一个函数调用它时,我可以直接传递调用函数的参数吗 如果

假设我有一个纯构造函数(只包含这个.Bar=Bar)

1) 当我从另一个函数调用它时,我可以在调用时直接传递调用方函数的参数,还是必须执行
var myBar=new bar,myBar.bar=thebar
,其中bar是调用方参数

2) 即使构造函数没有得到所有参数,它还会实例化吗

3) 我如何检查其中一个参数是否唯一,即对象的其他实例对于所讨论的属性没有此值?具体来说,我想在创建时为每个对象指定一个唯一的索引。也许是阵列

非常感谢

当我从另一个函数调用它时,我可以直接传递调用函数的参数吗

如果不能,那么在构造函数中使用
this.Bar=Bar
就没有多大意义了

即使构造函数没有得到所有参数,它还会实例化吗

如果缺少参数,则假设其中没有任何内容会引发异常,是的。参数的值仅为
未定义

我如何检查其中一个参数是否唯一,即对象的其他实例对于所讨论的属性没有此值

您需要有一个共享的存储区来检查它们

例如:

var Constructor = (function () {
    var unique_check_store = {};
    function RealConstructor(bar) {
        if (typeof bar == 'undefined') {
            throw "You must specify bar";   
        }
        if (unique_check_store.hasOwnProperty(bar)) {
            throw "You have already created one of these called '" + bar + "'";
        }
        this.Bar = bar;
        unique_check_store[bar] = true;
    }
    return RealConstructor;
})();

var a, b, c;
try {
    a = new Constructor();    
} catch (e) {
    alert(e);
}
try {
    b = new Constructor("thing");    
} catch (e) {
    alert(e);
}
try {
    c = new Constructor("thing");    
} catch (e) {
    alert(e);
}
alert(a);
alert(b);
alert(c);


​
当我从另一个函数调用它时,我可以直接传递调用函数的参数吗

如果不能,那么在构造函数中使用
this.Bar=Bar
就没有多大意义了

即使构造函数没有得到所有参数,它还会实例化吗

如果缺少参数,则假设其中没有任何内容会引发异常,是的。参数的值仅为
未定义

我如何检查其中一个参数是否唯一,即对象的其他实例对于所讨论的属性没有此值

您需要有一个共享的存储区来检查它们

例如:

var Constructor = (function () {
    var unique_check_store = {};
    function RealConstructor(bar) {
        if (typeof bar == 'undefined') {
            throw "You must specify bar";   
        }
        if (unique_check_store.hasOwnProperty(bar)) {
            throw "You have already created one of these called '" + bar + "'";
        }
        this.Bar = bar;
        unique_check_store[bar] = true;
    }
    return RealConstructor;
})();

var a, b, c;
try {
    a = new Constructor();    
} catch (e) {
    alert(e);
}
try {
    b = new Constructor("thing");    
} catch (e) {
    alert(e);
}
try {
    c = new Constructor("thing");    
} catch (e) {
    alert(e);
}
alert(a);
alert(b);
alert(c);


​
假设我有一个纯构造函数(只包含这个.Bar=Bar)

我假设你的意思是:

function MyConstructor(bar) {
    this.Bar = bar;
}
(注意:JavaScript中压倒性的惯例是属性名以小写字母开头。因此
this.bar
,而不是
this.bar
。最初的封顶标识符通常保留给构造函数。)

1) 当我从另一个函数调用它时,我可以在调用时直接传递调用方函数的参数,还是必须执行var myBar=new bar,myBar.bar=thebar,其中bar是调用方参数

您可以直接传递它们:

function foo(a, b, c) {
    var obj = new MyConstructor(b);
}
2) 即使构造函数没有得到所有参数,它还会实例化吗

JavaScript引擎不会检查传递的参数数。调用函数时,任何未传递的形式参数都将具有值
undefined

function MyConstructor(bar) {
    console.log(bar);
}
var obj = new MyConstructor(); // logs "undefined"
3) 我如何检查其中一个参数是否唯一,即对象的其他实例对于所讨论的属性没有此值?具体来说,我想在创建时为每个对象指定一个唯一的索引。也许是阵列

通常,这不在构造函数的范围内。但是,可以使用数组或对象来实现这一点

var knownBars = [];
function MyConstructor(bar) {
    if (knownBars.indexOf(bar) !== -1) {
        // This bar is known
    }
    else {
        // Remember this bar
        knownBars.push(bar);
    }
}
当然,
indexOf
可能不是您想要搜索的,因此您可能需要使用
Array.prototype
的其他方法或您自己的循环

另一种方法是使用对象;这假设
bar
是一个字符串或可以有效转换为字符串的内容:

var knownBars = {};
function MyConstructor(bar) {
    if (knownBars.indexOf(bar) !== -1) {
        // This bar is known
    }
    else {
        // Remember this bar
        knownBars[bar] = 1;
    }
}
假设我有一个纯构造函数(只包含这个.Bar=Bar)

我假设你的意思是:

function MyConstructor(bar) {
    this.Bar = bar;
}
(注意:JavaScript中压倒性的惯例是属性名以小写字母开头。因此
this.bar
,而不是
this.bar
。最初的封顶标识符通常保留给构造函数。)

1) 当我从另一个函数调用它时,我可以在调用时直接传递调用方函数的参数,还是必须执行var myBar=new bar,myBar.bar=thebar,其中bar是调用方参数

您可以直接传递它们:

function foo(a, b, c) {
    var obj = new MyConstructor(b);
}
2) 即使构造函数没有得到所有参数,它还会实例化吗

JavaScript引擎不会检查传递的参数数。调用函数时,任何未传递的形式参数都将具有值
undefined

function MyConstructor(bar) {
    console.log(bar);
}
var obj = new MyConstructor(); // logs "undefined"
3) 我如何检查其中一个参数是否唯一,即对象的其他实例对于所讨论的属性没有此值?具体来说,我想在创建时为每个对象指定一个唯一的索引。也许是阵列

通常,这不在构造函数的范围内。但是,可以使用数组或对象来实现这一点

var knownBars = [];
function MyConstructor(bar) {
    if (knownBars.indexOf(bar) !== -1) {
        // This bar is known
    }
    else {
        // Remember this bar
        knownBars.push(bar);
    }
}
当然,
indexOf
可能不是您想要搜索的,因此您可能需要使用
Array.prototype
的其他方法或您自己的循环

另一种方法是使用对象;这假设
bar
是一个字符串或可以有效转换为字符串的内容:

var knownBars = {};
function MyConstructor(bar) {
    if (knownBars.indexOf(bar) !== -1) {
        // This bar is known
    }
    else {
        // Remember this bar
        knownBars[bar] = 1;
    }
}

奇怪-似乎是人们想做的事情,用索引实例化对象-我做得不对吗?@jamesson:我不明白你所说的“…用索引实例化对象…”是什么意思,使用构造函数创建实例,然后以某种方式标记它们以找到它们later@jamesson:我认为这有点不寻常,因为如果您保留已创建实例的副本,那么垃圾收集器将永远无法回收这些实例。(目前,下一个版本的JavaScript可能会有“弱”引用来描述这类内容。)对不起,复制一份?你是说,仅仅通过在数组中引用它们,或者在我制作它们时将它们放入数组中,我不知何故最终得到了两个副本?奇怪的是,人们希望用索引实例化对象,这似乎是一件很奇怪的事情——我是不是走错了方向?@jamesson:我不明白