为什么这三行代码会导致定义Javascript" class"?

时间:2015-07-25 23:08:51

标签: javascript

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。这与定义一个类(或类似的东西)有什么关系?

2 个答案:

答案 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在他的回答中已经解释了具有这种功能的原因。