在原型更改构造函数中传递Object literal?

时间:2015-03-11 15:56:43

标签: javascript

function Person(name) {
   this.name = name;
}

Person.prototype = {
  sayName: function()  {
    console.log(this.name);
  },

 toString: function() {
   return "[Person " + this.name + "]";
  }
};

当我在原型中传递对象文字时,它会更改构造函数属性,因此它现在指向Object而不是Person。为什么这样 ?请别人解释一下。

2 个答案:

答案 0 :(得分:1)

您只需将Person.prototype设置为对象即可。对象constructorObject,因此Person的构造函数也变为Object。你有什么期望?

您可以逐个设置属性,也可以只添加构造函数属性:

function Person(name) {
   this.name = name;
}

Person.prototype = {
  sayName: function()  {
    console.log(this.name);
  },

 toString: function() {
   return "[Person " + this.name + "]";
  },

  constructor: Person
};

正如TravisJ评论的那样,使用Object.defineProperty设置它可能会更好,这样我们就可以将可枚举性设置为false,因为它是默认的。

Object.defineProperty(Person.prototype, 'constructor', {
    configurable: true,
    writable: true,
    enumerable: false, // this is the default; including as an example
    value: Person
});

答案 1 :(得分:0)

默认情况下,原型指向一个对象,其属性(命名构造函数)是被调用函数的名称。

此属性基本上告诉从哪个函数或父元素构造新对象。

当您使用自定义对象文字覆盖它时,此信息将丢失。通常当找不到属性时,它会在原型链中查找,在这种情况下,它会在" Object"中找到构造函数属性。您可以在文字中添加构造函数属性。这样查找将停止在您创建的新对象上。