假设我有一个纯构造函数(只包含 this.Bar = bar)
1)当我从另一个函数调用它时,我可以在调用时直接传递调用者函数的参数还是必须这样做var myBar=new bar, myBar.Bar=thebar
,其中 bar 是调用者参数?
2)即使没有得到所有参数,构造函数是否仍会实例化?
3)如何检查其中一个参数是否唯一,即没有其他对象实例具有该属性的此值?具体来说,我想在创建时为每个对象分配一个唯一索引。也许阵列?
提前谢谢了
假设我有一个纯构造函数(只包含 this.Bar = bar)
1)当我从另一个函数调用它时,我可以在调用时直接传递调用者函数的参数还是必须这样做var myBar=new bar, myBar.Bar=thebar
,其中 bar 是调用者参数?
2)即使没有得到所有参数,构造函数是否仍会实例化?
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)即使没有得到所有参数,构造函数是否仍会实例化?
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;
}
}
当我从另一个函数调用它时,我可以直接传递调用者函数的参数吗
this.Bar = bar
如果你不能,那么在构造函数中就没有多大意义了。
即使没有得到所有参数,构造函数是否仍会实例化?
如果缺少参数,则假设其中没有任何内容会引发异常,是的。参数只得到undefined
.
如何检查其中一个参数是否唯一,即没有其他对象实例具有该属性的此值?
您需要检查它们的共享存储。
例如:
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);