与普通的OO语言相比,Javascript中的"OO"是否有效?

Nis*_*ant -4 javascript oop function

JavaScript不是面向类的编程语言.但是,有一些方法可以在JavaScript中创建对象实例.我已经读过一个这样的方法是一个函数构造函数方法来创建"实例",一种方法是这样的:

function Circle(radius) {
    this.radius = radius;
    Circle.prototype.area = function () {
        return this.radius * this.radius * 3.14
    }
}
smallWheel = new Circle(2); bigWheel = new Circle(5);
smallWheel.area == bigWheel.area => True;
Run Code Online (Sandbox Code Playgroud)

是不是有在一个低效率Circle.prototype.area再次复位到相同的功能"串" function () { return this.radius * this.radius * 3.14 当你调用Circle(2)Circle(5)

虽然它设置了相同的值,但效率不高吗?想象一下,有数百个实例......这可能效率低下?

根据我的理解,正常的OO语言不需要为一个实例反复编译函数,因为它是共享的.任何人都可以澄清吗?

编辑:这是我的疏忽,我错过了函数体后面的下一行'}'.然而,下面的答案特别有用,特别是它应该在外面定义的部分,这个区域是低效的.

Mat*_*att 6

我认为你在JavaScript中定义一个对象的两种方法之间感到困惑:

function Circle(radius) {
    this.radius = radius;
    this.area = function () {
        return this.radius * this.radius * 3.14
    }
}
Run Code Online (Sandbox Code Playgroud)

...... vs:

function Circle(radius) {
    this.radius = radius;
}

Circle.prototype.area = function () {
    return this.radius * this.radius * 3.14
}
Run Code Online (Sandbox Code Playgroud)

两者都可以以完全相同的方式被调用和使用;

var x = new Circle(5);

x.area();
Run Code Online (Sandbox Code Playgroud)

但是,在第一个例子中,是的,你是对的; 该函数实例将存在于每个实例上Circle,如果您有许多实例,则效率低下.

但是,对于第二个示例,该area函数存在一次.

使用原型链定义方法与定义上的区别this,直接穿过了很多更详细的JavaScript的"原型"与"本"的使用?; 我强烈建议阅读它.