在JavaScript中,"构造函数"来自?

时间:2012-02-07 01:36:57

标签: javascript

以下代码片段取自Eloquent JavaScript。

var noCatsAtAll = {};
if ("constructor" in noCatsAtAll)
  console.log("Yes, there definitely is a cat called 'constructor'.");

我觉得这很神秘。为什么'if'会返回true?

4 个答案:

答案 0 :(得分:6)

JavaScript对象有一个名为constructor的函数,它是创建对象实例的函数。它内置于所有对象。 in运算符在字典实例中测试某些的存在,称为“构造函数”,因此它返回true。例如,如果您测试length,则会发生同样的事情。

答案 1 :(得分:5)

Object的所有实例都有一个constructor属性,用于指定构造Object原型的函数。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object#Properties_2

in运算符会查看所有属性,包括继承的属性。如果您只想查看对象本身的属性,可以使用hasOwnProperty

var a = {};
"constructor" in a; // true
a.hasOwnProperty("constructor"); // false

请注意,虽然in运算符看到"constructor",但for (key in a)循环不会。这是因为"constructor"属性是不可枚举的。

答案 2 :(得分:2)

它是Object类型的构造函数。直接在对象的属性(“构造函数”)上提供对constructor函数的引用(它也适用于您编写的构造函数)。

反过来,存在的属性名称是in个对象。

答案 3 :(得分:1)

constructorObject的一种方法。除非您修改它,否则您可以在所有对象中找到constructor方法。 in运算符将通过prototype链找到方法。这就是为什么建议使用hasOwnProperty来测试您自己对象中的属性的原因。

    var noCatsAtAll = {};
    if ("constructor" in noCatsAtAll)
      console.log("Yes, there definitely is a cat called 'constructor'.");

    if ('constructor' in Object)
       console.log("Yes, there is also a method called constructor");

    var noCon = Object.create(null); // create a completetly empty object
    console.log('constructor' in noCon); // false

    function hasConstructorToo() {}

    console.log('constructor' in hasConstructorToo) // true
    console.log('constructor' in []); // true

http://jsfiddle.net/Xsb3E/3`