代码之家  ›  专栏  ›  技术社区  ›  Mike Cheel

为什么调用函数的旧构造函数?

  •  1
  • Mike Cheel  · 技术社区  · 9 年前

    我的理解是,当您将函数的函数原型更改为指向不同的对象时,新原型的构造函数将指向新对象的原型构造函数。

    https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new :

    2) 使用指定的参数调用构造函数Foo, 并将其绑定到新创建的对象。新的Foo是等效的 没有争论。

    3) 构造函数返回的对象成为 全新的表情。如果构造函数没有 显式返回一个对象,使用在步骤1中创建的对象 相反(通常构造函数不返回值,但它们可以 如果要覆盖正常对象创建,请选择这样做 过程。)

    此外,从 https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Inheritance :

    行,老师。prototype的构造函数属性现在等于 从Person继承其属性。原型尝试保存您的 编码,在浏览器中加载页面,然后输入

    在我下面的示例中,customPrototype从对象继承其属性。据我所知是原型,所以一旦我重新分配了这个人。它还应该更改构造函数。记录下来,我看到构造函数确实发生了变化!

    // Some custom object to inherit  
    var customPrototype = {
      name: "XYZ"
    };
    
    // Person has its prototype object pointing to Object.prototype
    var Person = function() {  
      this.name = "Not XYZ";
    };
    
    // Prints function() {this.name = "Not XYZ";}
    console.log(Person.prototype.constructor);
    
    // Change Person prototype to point to the custom prototype object
    Person.prototype = customPrototype;
    
    // Prints function Object() { [native code] }
    console.log(Person.prototype.constructor);
    
    var p = new Person();
    
    // Prints Not XYZ
    console.log(p.name);
    

    鉴于上述示例,我希望姓氏打印XYZ,因为customPrototype对象不会覆盖任何内容。

    1 回复  |  直到 9 年前
        1
  •  3
  •   Suren Srapyan    9 年前

    Prototype.constructor 与对象初始化无关。当您想要创建一个对象时,您可以调用 new Person() Person 函数,将对象作为上下文传递( this )并返回该对象。 人 函数被调用,不管你有什么样的原型。因为在这个函数中,你有一个属性 name Not XYZ ,它将具有该值。它用相同的名称隐藏prototype属性。如果要从对象中删除此属性并尝试再次访问 名称 ,你会得到一个原型。

    var customPrototype = {
      name: "XYZ"
    };
    
    var Person = function() {  
      this.name = "Not XYZ";
    };
    
    Person.prototype = customPrototype;
    var p = new Person();
    console.log(p.name);
    delete p.name;
    console.log(p.name);

    我们设置了 prototype.constructor 为了保持物体的精确构造,如果我们想根据物体的类型进行一些检查。

    为类型的对象实现复制逻辑 人

    function Person(name) {  
       this.name = name;
    };
    
    Person.prototype.copy = function() {
      return new this.constructor(this.name); // Access by `constructor` property, it is not necessary to call directly `Person`
    }
    
    const person = new Person('Bob');
    console.log(person.name);
    const secondPerson = person.copy();
    console.log(secondPerson.name);
    console.log(person === secondPerson);