javascript构造函数的细节

时间:2012-05-29 16:15:50

标签: javascript oop

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

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

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

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

非常感谢提前

2 个答案:

答案 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);


​