【问题标题】:Why would these three lines of code result in the definition of a Javascript "class"?为什么这三行代码会导致 Javascript “类”的定义?
【发布时间】:2015-10-16 09:25:16
【问题描述】:

Javascript microlibrary augment.js 有时用于在 Javascript 代码中包含类似 OOP 的功能。尽管每天都在使用 Javascript,但我对语言的内部工作原理仍然有些幼稚,因此我经常依赖或借鉴其他库的模式来避免陷阱。

augment.js 库中的一个函数是defclass,它很短:

augment.defclass = function (prototype) {
        var constructor = prototype.constructor;
        constructor.prototype = prototype;
        return constructor;
    };

我的问题是:这和定义一个类有什么区别?看起来它所做的只是1)将输入constructorprototype设置为输入本身,然后2)返回constructor。这与定义一个类(或类似类)有什么关系?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    这样定义的类:

    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 版本对于其他语言的用户来说看起来更熟悉。一个从原型中提取构造函数,另一个将原型放在构造函数上。

    【讨论】:

      【解决方案2】:

      这和定义一个类有什么区别?

      你首先需要回答的问题是:Javascript中的类是什么?

      发件人:Object vs Class vs Function

      正如您现在必须知道的那样,在 JavaScript。相反,JavaScript 中的函数可能会表现得像 通过在函数调用之前使用 new 关键字来构造构造函数。这 被称为构造函数模式。

      来自:JavaScript: The Good PartsDouglas Crockford,O'Reilly Media,2008 年 5 月 8 日,第 29 页

      如果使用new 前缀调用函数,则新对象将 使用指向函数prototype 值的隐藏链接创建 成员,this 将绑定到该新对象。

      所以再次没有类 - 你有可以用new 调用的函数。如果这些函数具有prototype 属性,则创建的新对象继承自该原型。

      定义要用作构造函数的 Javascript 函数所需要做的就是设置您希望实例在其原型属性上继承的属性,并且(正如您在问题中指出的那样)augment.defclass 正在这样做。

      minitech 在他的回答中已经解释了拥有这样一个功能的原因。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 2012-08-27
        • 2015-08-17
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多