1

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

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

2)即使没有得到所有参数,构造函数是否仍会实例化?

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

提前谢谢了

4

2 回答 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;
    }
}
于 2012-05-29T16:21:07.010 回答
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);


​
于 2012-05-29T16:19:32.780 回答