【问题标题】:How come the object is created in this case?在这种情况下如何创建对象?
【发布时间】:2021-09-16 09:01:41
【问题描述】:

在这种情况下,prototype 对象不再具有 constructor 属性。这里只是一个空对象。但是,尽管如此,new obj.constructor 仍然以某种方式创建了一个空对象。怎么样?

function Constructor() { 
    this.name = 'Kira';
    this.age = 35;
    this.city = 'New-York';
}; 
Constructor.prototype = {};

let obj = new Constructor;
let obj2 = new obj.constructor;
console.log(obj2); //{}

这里也创建了对象。在Chrome浏览器的控制台中,显示为String

function User(name) {
  this.name = name;
}
User.prototype = {};

let user = new User('John');
let user2 = new user.constructor('Pete');

console.log(user2);

怎么可能?这里的对象是如何创建的?

【问题讨论】:

    标签: javascript object prototype


    【解决方案1】:

    当您将原型设置为{} 时,这并不意味着没有属性。这意味着唯一的属性是您可以在新对象上找到的属性。特别是,constructor 属性来自原型并指向Object

    const o = {};
    
    console.log("has constructor property:",
      "constructor" in o);
    console.log("constructor property is own:", 
      o.hasOwnProperty("constructor"));
    console.log("constructor property comes from prototype:",
      Object.getPrototypeOf(o).hasOwnProperty("constructor"));
    console.log("constructor property is Object():",
      o.constructor === Object);

    所以,当您调用new obj.constructor 时,它相当于new Object

    function Foo() {}; 
    Foo.prototype = {};
    
    let obj = new Foo;
    console.log(obj.constructor === Object);
    console.log(obj.constructor === ({}).constructor);
    let obj2 = new obj.constructor;
    console.log(obj2); //{}

    当调用new user.constructor('Pete'); 时再次调用全局Object,因此它与new Object('Pete') 相同。如果你传递一个具有对象包装器的值,你会从构造函数中获得该包装器:

    const pete = new Object('Pete');
    console.log(typeof pete, pete instanceof String);
    
    const answer = new Object(42);
    console.log(typeof answer, answer instanceof Number);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-10
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多