Javascript microlibrary augment.js有时用于在Javascript代码中包含类似OOP的功能。尽管我每天都在使用Javascript,但我对这种语言的内部运作仍然有点天真,所以我经常依赖或借用其他库中的模式来避免陷阱。
augment.js
库中的一个函数是defclass
,这很短:
augment.defclass = function (prototype) {
var constructor = prototype.constructor;
constructor.prototype = prototype;
return constructor;
};
我的问题是:如何定义一个类?看起来它只是1)将输入prototype
的{{1}}设置为输入本身,然后2)返回constructor
。这与定义一个类(或类似的东西)有什么关系?
答案 0 :(得分:4)
这样定义的类:
var Thing = augment.defclass({
constructor: function () {
this.x = 5;
},
getX: function () {
return this.x;
}
});
典型的JavaScript构造函数:
function Thing() {
this.x = 5;
}
Thing.prototype.getX = function () {
return this.x;
};
它们都具有相同的效果,但defclass
版本看起来更熟悉其他语言的用户。一个从原型中提取构造函数,另一个将原型放在构造函数上。
答案 1 :(得分:2)
这怎么会像定义一个类?
首先需要回答的问题是:Javascript中的类是什么?
来自:Object vs Class vs Function
你必须已经知道,现在没有课程 JavaScript的。相反,JavaScript中的函数可能会表现得像 构造函数通过使用new关键字进行函数调用。这个 被称为构造函数模式。
来自:JavaScript: The Good Parts Douglas Crockford,O'Reilly Media,2008年5月8日,第29页
如果使用
new
前缀调用函数,则会有一个新对象 使用函数prototype
的值的隐藏链接创建 成员,this
将绑定到该新对象。
所以再没有类 - 你有可以用new
调用的函数。如果这些函数具有prototype
属性,则创建的新对象将继承该原型。
定义要用作构造函数的Javascript函数所需要做的就是设置希望实例在其prototype属性上继承的属性(正如您在问题中指出的那样)augment.defclass
正在执行此操作
minitech在他的回答中已经解释了具有这种功能的原因。