【问题标题】:Object.create() and toString()Object.create() 和 toString()
【发布时间】:2011-12-19 04:32:24
【问题描述】:

鉴于这些代码

var Person = function(firstName, lastName) {
  this.firstName = firstName;
  this.lastName = lastName;
};

Person.prototype = {
  toString: function() { return this.firstName + ' ' + this.lastName; }
};

var test4 = Object.create(Person);
test4.firstName = "Phat4";
test4.lastName = "Wang4";
console.log(test4.toString === Object.toString); // true
console.log(test4.toString === Function.toString); // true

var test5 = { firstName: "Phat5", lastName: "Wang5" };
console.log(test5.toString === test4.toString); // false
console.log(test4.toString === Function.toString); // true
console.log(test5.toString === Object.prototype.toString); // true

console.log(test5.toString()); // [object Object]
console.log(test4.toString()); // Function.prototype.toString called on incompatible object

为什么最后一行console.log(test4.toString()) 会抛出错误?它表明test4.toString 不像test5.toString 但我不明白..

附言。我已经尝试搜索线程,但仍然无法回答自己。对不起,如果这与任何重复。

【问题讨论】:

    标签: javascript inheritance object prototypal-inheritance


    【解决方案1】:

    而不是这个:

    var test4 = Object.create(Person);
    

    你应该这样做:

    var test4 = Object.create(Person.prototype);
    

    按照您的方式,test4 在其原型链中具有 Person 函数,而不是具有您的 toString 方法的预期原型对象。

    因此,它使用了 toString() 方法,显然预计会针对 Function 对象调用。

    【讨论】:

    • 所以这意味着test4.toString()Function.toString() 覆盖从Object 继承的toString() 方法,对吧?
    • @PhatWangrungarun:是的,它覆盖了Object.prototype.toString 方法,这是通用方法。
    【解决方案2】:

    分配给原型和将新属性分配给对象的原型是有区别的。

    您将函数 Person 声明为构造函数,但随后您通过执行以下操作几乎为它的原型分配了一些东西:

    Person.prototype = {
      toString: function() { return this.firstName + ' ' + this.lastName; }
    };
    

    这意味着您将新的对象键值对 toString-function 分配给 Person.prototype,而不是实际向其添加新属性,您应该在其中这样做:

    Person.prototype.toString = function() { return this.firstName + ' ' + this.lastName; }
    

    由此带来的是,当您通过调用 Object.create 实际创建一个继承自 Person 对象的新对象时,在其实现中发生的事情是一个新对象将被重新创建,然后它将返回该新对象对象,它将覆盖 javascript 假设您通过之前在代码中执行 Person.prototype 分配创建的原型属性。

    【讨论】:

      【解决方案3】:
      var Person = function(firstName, lastName) { 
          this.firstName = firstName; 
          this.lastName = lastName;
        }; var p1=new Person("Phat1","Wang1");
      

      p1 是一个对象

      var p2= Object.create(Person);
      p2.firstName="Phat2";
      p2.lastName="Wang2";
      

      p2 是一个函数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-04
        • 1970-01-01
        • 1970-01-01
        • 2012-10-07
        • 2021-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多