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
。怎么会来?
旁注:我在类似的问题中发现了一些提示,但据我了解,这几乎与我无关。
感谢您的时间,知识和关注。
答案 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()
干杯
灰