这是在 JavaScript 中描述“类”或构造函数的教科书标准方法,直接来自JavaScript 权威指南:
function Rectangle(w,h) {
this.width = w;
this.height = h;
}
Rectangle.prototype.area = function() {
return this.width * this.height;
};
我不喜欢这里的悬空原型操作,所以我试图想一种方法来封装area
构造函数内部的函数定义。我想出了这个,我没想到它会起作用:
function Rectangle(w,h) {
this.width = w;
this.height = h;
this.constructor.prototype.area = function() {
return this.width * this.height;
};
}
我没想到这会起作用,因为函数this
内部的引用area
应该指向area
函数本身,所以我无法访问width
和height
从this
. 但事实证明我愿意!
var rect = new Rectangle(2,3);
var area = rect.area(); // great scott! it is 6
一些进一步的测试证实,函数this
内部的引用area
实际上是对正在构建的对象的引用,而不是 area 函数本身。
function Rectangle(w,h) {
this.width = w;
this.height = h;
var me = this;
this.constructor.prototype.whatever = function() {
if (this === me) { alert ('this is not what you think');}
};
}
原来警报弹出,并且this
正是正在构建的对象。那么这里发生了什么?为什么this
不是this
我期望的那样?