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语言不需要在实例共享时反复编译函数。任何人都可以澄清吗?
编辑:这是我的疏忽,我错过了一个'}'在函数体后面的下一行。然而,下面的答案特别有用,特别是它应该在外面定义的部分,这个区域是低效的。
答案 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());