是" OO"与普通的OO语言相比,Javascript效率如何?

时间:2014-05-24 09:34:08

标签: javascript function oop

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;

是否存在低效率,Circle.prototype.area再次重置为相同的功能" string" function () { return this.radius * this.radius * 3.14 当您调用Circle(2)Circle(5)时?

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

根据我的理解,正常的OO语言不需要在实例共享时反复编译函数。任何人都可以澄清吗?

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

2 个答案:

答案 0 :(得分:6)

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

function Circle(radius) {
    this.radius = radius;
    this.area = function () {
        return this.radius * this.radius * 3.14
    }
}

... vs:

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

Circle.prototype.area = function () {
    return this.radius * this.radius * 3.14
}

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

var x = new Circle(5);

x.area();

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

然而,对于第二个示例,area函数存在一次

使用原型链定义方法与直接定义this之间的区别在于Use of 'prototype' vs. 'this' in JavaScript?中的更多细节。我强烈建议你阅读它。

答案 1 :(得分:3)

首先 - JavaScript是一种面向对象的编程语言。

然而,它不是基于 class 的编程语言。

虽然有更有效的方法来编写构造函数和对象:

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

Circle.prototype.area = function () {    
    return this.radius * this.radius * Math.PI;
};

smallWheel = new Circle(2);
bigWheel = new Circle(5);



// The same method -- this is true
console.log("Method match: " +    smallWheel.area == bigWheel.area);

// value match
console.log("Value match: " + smallWheel.area() == bigWheel.area());