基础JavaScript OO

Kan*_*ane 6 javascript

好的,我应该知道答案,但由于某种原因,我从来没有真正了解或需要真正了解JavaScript.

我的问题是:查看下面的代码示例,我的理解是正确的还是我错过了一些信息.


样品1

需要实例化函数(或类)才能使用该IsOld方法,并IsOld为每个实例创建一个单独的函数副本.

function MyClass1() {
    this.IsOld = function (age) {
        if (age > 40) {
            return true;
        }
        return false;
    };
}

// sample usage
var m1 = new MyClass1();
console.log(m1.IsOld(34));
Run Code Online (Sandbox Code Playgroud)

样本2

需要实例化但不像MyClass1脚本引擎不需要IsOld为每个类实例创建方法的副本.

var MyClass2 = (function () {
    function MyClass2() { }

    MyClass2.prototype.IsOld = function (age) {
        if (age > 40) {
            return true;
        }
        return false;
    };

    return MyClass2;
})();

// sample usage
var m2 = new MyClass2();
console.log(m2.IsOld(34));
Run Code Online (Sandbox Code Playgroud)

样本3

无需实例化函数/类来访问该IsOld方法.IsOld在所有调用中使用该方法的单个实例.

var MyClass3 = {
    IsOld: function (age) {
        if (age > 40) {
            return true;
        }
        return false;
    },
};

// sample uage
console.log(MyClass3.IsOld(34));
Run Code Online (Sandbox Code Playgroud)

注意:我猜这里有很多类似的问题/答案,但由于某种原因,我找不到一个对我有意义的问题.

Bud*_*hiP 2

您的理解似乎是正确的。

如果“需要实例化”是指使用“new”关键字,我想在这里添加一些内容。

在 JavaScript 中,使用 new 关键字并不是创建新实例的唯一方法。(根据评论编辑)任何函数都可以充当构造函数。

当您使用“new”关键字后跟任何函数(例如“x”)时,它的作用是

  1. 创建新对象(例如“y”),并将函数 x 的原型设置为新对象(y 的)原型。
  2. 在新创建的对象 y 的上下文中调用函数“x”,即 this 将引用函数“x”内的新对象“y”
  3. 如果函数不返回对象,则返回由 new 运算符创建的新对象“x”作为 new 表达式的结果。

这是 Douglas Crockford 所著的学习 JavaScript 的好资源 ( http://javascript.crockford.com/ )

因此,如果您担心内存(您应该担心),请使用构造函数,并将所有常用方法添加到函数原型中,就像在示例 2 中所做的那样。

然后所有这些方法将被继承到使用该函数作为构造函数创建的所有对象。然而,正如之前提到的,我认为示例 2 可以更简单:

var MyClass2 = function MyClass2() { };

MyClass2.prototype.IsOld = function (age) {
    if (age > 40) {
        return true;
    }
    return false;
};

var obj = new MyClass2();
Run Code Online (Sandbox Code Playgroud)