假设我有一个纯粹的构造函数(只包含this.Bar = bar)
1)当我从另一个函数调用它时,我是否可以在调用时直接传递调用函数的参数,或者我必须执行var myBar=new bar, myBar.Bar=thebar
,其中bar是调用者参数?
2)构造函数是否仍会实例化,即使它没有得到所有的args?
3)如何检查其中一个args是否唯一,IE没有该对象的其他实例具有该属性的该值?具体来说,我想在创建时为每个对象分配一个唯一索引。也许数组?
非常感谢提前
答案 0 :(得分:3)
假设我有一个纯粹的构造函数(只包含this.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)构造函数是否仍会实例化,即使它没有得到所有的args?
JavaScript引擎不会检查传递的参数数量。在调用函数时,任何未传递的正式参数都将具有值undefined
:
function MyConstructor(bar) {
console.log(bar);
}
var obj = new MyConstructor(); // logs "undefined"
3)如何检查其中一个args是否唯一,IE没有该对象的其他实例具有该属性的该值?具体来说,我想在创建时为每个对象分配一个唯一索引。也许数组?
通常,这通常不是构造函数的范围。但是,是的,您可以使用数组或对象来做到这一点。
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;
}
}
答案 1 :(得分:1)
当我从另一个函数调用它时,我可以直接传递调用函数的参数吗
如果你不能在构造函数中使用this.Bar = bar
,那就没什么意义了。
构造函数是否仍会实例化,即使它没有获得所有的args?
如果缺少参数,假设其中没有任何内容会抛出异常,是的。参数的值为undefined
。
如何检查其中一个args是否唯一,IE该对象的其他实例是否具有该属性的此值?
您需要拥有一个您检查过的共享商店。
例如:
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);