为什么在构造函数中未定义this.prototype?

时间:2018-07-16 08:54:16

标签: javascript ecmascript-5

tl; dr:可以使用prototype在其构造函数中访问对象Object.getPrototypeOf(this)。它并非简单地带有:this.prototype。为什么?

我有一个简单的问题。我认为Ecmascript-5专家将帮助我阐明神秘的this

我的目的是编写一些参考代码,以通过嵌入在 IIFE (立即调用函数表达式)中的 constructor 声明一个类,并将此教学模式用作模板需要的时候。这种构造的好处是它允许声明实例和类数据。将所有方法都放在prototype Object 中也很好。 Here is what I came up with

var Person = (function(){
  // class scope variables
  var persons = [];
  // constructor with variables
  return function(name, age){
   // gets the prototype of Object: useful for defining methods
   // could also be: proto = Person.prototype
   var proto = Object.getPrototypeOf(this);
   // instance variable
   this.name = name;
   this.age = age;
   persons.push(this);
   // method which accesses to both class and instance variables
   if (!proto.stats) // avoids re-inventing the wheel upon each New
    proto.stats = function() {
     for(var acc=0, n=0; n<persons.length; n++)
      acc+=persons[n].age;
     return this.name + ": " + 
            this.age + " (average: " + acc/n + ")";
    };
   return this; // not required, just to remember what it does normally
  };
})(); // IIFE
// a classic method (cannot access class variables)
Person.prototype.toString = function(){
  return this.name + ": " + this.age + " years old";
};

我实现了目标,这种模式看起来相当可扩展,方法位于prototype Object 中,而不是实例中。但是,有些事情令我感到奇怪:我不是想在{em> Constructor 中使用var proto =声明和使用proto,而是首先使用this.prototype。但这是undefined。怎么会来?

旁注:我在类似的问题中发现了一些提示,但据我了解,这几乎与我无关。

感谢您的时间,知识和关注。

1 个答案:

答案 0 :(得分:2)

尝试遵循以下示例。我还建议您阅读http://shop.oreilly.com/product/9780596517748.do这本书,以了解您使用JavaScript所做的事情。

function Car() {
  console.log(this)                 // I'm the new Car "instance"
  console.log(typeof this)          // I'm of type object
  console.log(this instanceof Car)  // but I'm an instance of Car
  console.log(this.prototype)       // I'm undefined because __proto__ is the reference to the prototype
  console.log(this.__proto__)       // This is the prototype
}

Car.prototype.drive = function drive() {
  console.log('I\'m driving')
}

const fiat = new Car()
fiat.drive()

干杯