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

重新分配原型时未重写链接对象的构造函数属性

  •  0
  • HalfWebDev  · 技术社区  · 6 年前

    假设我有这个密码。

    function Foo(){}
    Foo.prototype.constructor === Foo; // true
    var a = new Foo();
    a.constructor === Foo; // true
    

    所以基本上在这里 a.contructor 通过委托过程返回Foo,并从 Foo.prototype.constructor .

    好 啊。如果我把Foo.prototype重写为

    function Foo(){}
    Foo.prototype.constructor === Foo; // true
    var a = new Foo();
    Foo.prototype = {};
    Foo.prototype.constructor === Foo; // false
    a.constructor === Foo; // true;
    

    最后两行是不可消费的。不应该 a.constructor 还将被修改并返回与 Foo.prototype.构造函数 因为a毕竟链接到Foo.prototype,Javascript不创建副本,而是创建对象之间的链接(委托)

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jonas Wilms    6 年前

    Javascript不创建副本,而是创建对象之间的链接(委托)

    实际上,它存储对对象的引用。在你的情况下 Foo.prototype a[[prototype]] 引用同一个对象,然后更改 Foo.原型 但是 原型 仍然指向旧的那个。但是,如果您这样做:

     Foo.prototype.constructor = null;
    

    那么两个比较都将是错误的。或者重写两个引用:

     Foo.prototype = {};
     Object.setPrototypeOf(a, Foo.prototype); // thats like a[[prototype]] = Foo.prototype