代码之家  ›  专栏  ›  技术社区  ›  David542

是否在对象本身上定义过构造函数?

  •  1
  • David542  · 技术社区  · 4 年前

    有没有过这样的情况 constructor 属性将在对象/函数/类本身上定义,还是只出现在 prototype ? 例如:

    let a = new Array();
    console.log(a.hasOwnProperty('constructor'), a.constructor);
    // false -- constructor not defined on Array, but Array.prototype
    
    let f = function(){};
    console.log(f.hasOwnProperty('constructor'), f.constructor);
    // false -- constructor not defined on function, but function.prototype
    2 回复  |  直到 4 年前
        1
  •  2
  •   CertainPerformance    4 年前

    从技术上讲,发生这样的事情是可能的,但这是一种代码气味。

    function Klass(){
      this.constructor = Klass;
    }
    const k = new Klass();
    console.log(k.hasOwnProperty('constructor'), k);

    (你也可能会在某人不恰当的时候看到它 extends a function class )

    对象实例应具有 .constructor 所有物 on their prototype ,而不是直接在实例上。如果属性直接位于实例上,那么当有人试图使用一种常用方法来迭代自己的属性并查找时,就会出现问题 constructor 那里

    它应该在原型上而不是在对象本身上的另一个原因是利用原型继承。如果某个属性可以存在于 对象,在原型上,这样做比在任何地方、每个实例复制该属性更好。而且构造函数属性已经自动出现在原型上,所以无论如何都不需要处理它。

    出于类似的原因,在可能的情况下,类方法通常位于类原型上,而不是为每个实例复制。也就是说,所有实例都使用该方法从一个原型继承,而不是所有实例都有自己的属性方法。也就是说,拥有它并不好

    class Klass {
      constructor() {
        this.method = () => console.log('method');
      }
    }
    const k = new Klass();
    k.method();

    在每个实例都复制了该方法的情况下

    class Klass {
      method() {
        console.log('method');
      }
    }
    const k = new Klass();
    k.method();

    只在原型机上有。

        2
  •  0
  •   JeffreytheCoder    4 年前

    看看医生 Object.prototype.hasOwnProperty .

    与in操作符不同,此方法不检查对象原型链中的指定属性。

    这个 constructor 财产只存在于 Object.prototype .还有 prototype 属性仅存在于对象构造函数中。

    enter image description here